GUI+Zufallszahlen+Range

Original geschrieben von christianSch
Leichter gesagt als getan, vorallem mit dem obigen :confused:
der Rest war ja soweit ok

Wo ist denn das Problem?
Deine Hauptanwendung ist ein JFrame. Beim Start öffnest Du einen JDialog, d.h. MyDialog extends JDialog.
Darin ein Label für Anz Spalten und ein Label für ANz Zeilen, dazu je ein JTextField für die Eingaben. Schliesslich noch OK Button.
Dann den anderen Dialog öffnen:
Label "Spalte"
Label mit Spaltennr
Label untere Schranke
Label obere Schranke
JTextField für untere Schranke
JTextField für obere Schranke
Button OK
 
mein Problem ist das ich ein Anfänger bin

1. wie koppel ich die 2 Dialoge aneinander- damit dann auch der 2te Dialog beim ok-Button des 1ten Dialoges geöffnet?

2. bei meiner Klasse RandomRange haut auch irgendwas nicht hin.
Hab aber nicht genug Erfahrung/ Praxis & Kenntnisse um zu sehen was da mein Fehler ist
 
Zweiter Dialog
Code:
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class Dialog2 {
	public static void main(String[] args) {
		
			String input =
				JOptionPane.showInputDialog(
					null,
					"Spalten",
					"Titel",
					JOptionPane.INFORMATION_MESSAGE);
				
			System.out.println(input);
		
			//Anzahl der Textfelder einlesen
			int textFieldCnt = Integer.parseInt(input);
			//Standardmäßige Breite der Textfelder
			int defaultTextfieldSize = 10;

			String[] fieldNames = new String[textFieldCnt];
			int[] fieldCols = new int[textFieldCnt];

			Arrays.fill(fieldCols, defaultTextfieldSize);

			for (int i = 1; i < textFieldCnt; i++) {
				fieldNames[i] = "Spalte " + i + ": ";
			}

			new Dialog2().doIt(fieldNames, fieldCols);

		}

		/**
		 * @param fieldNames
		 * @param fieldCols
		 */
		private void doIt(String[] fieldNames, int[] fieldCols) {
			// TODO Auto-generated method stub
			new CustomDialog("Wertebereich der Spalten", null, fieldNames, fieldCols).show();
		}

		class CustomDialog extends JDialog {

			private int textFieldCnt;

			private JTextField[] textFields;
			private JLabel[] labels;
			private JButton btnCancel;
			private JButton btnOk;
			private JPanel componentPanel;
			private JPanel controlsPanel;
			private JScrollPane scrollPane;

			public CustomDialog(
				String title,
				Frame owner,
				String[] textFieldNames,
				int[] fieldCols) {
				
				super(owner);
				setSize(320, 240);
				setTitle(title);
			
				getContentPane().setLayout(new BorderLayout());
			
				textFields = new JTextField[textFieldNames.length];
				labels = new JLabel[textFieldNames.length];
			
				componentPanel = new JPanel();
				GridLayout grid = new GridLayout(fieldCols.length, 2);
				componentPanel.setLayout(grid);
			
				controlsPanel = new JPanel();
			
				scrollPane = new JScrollPane();
				scrollPane.setSize(300, 200);
				scrollPane.getViewport().add(componentPanel);
				getContentPane().add(scrollPane, BorderLayout.CENTER);
			
				generatetextFields(textFieldNames, fieldCols);
			
				btnOk = new JButton("OK");
				btnOk.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						//Sammle die Textfeldinhalte ein und tue etwas ...
						setVisible(false);
						dispose();
						System.out.println("Verarbeite Daten ...");
					}
				});

				btnCancel = new JButton("Cancel");
				btnCancel.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						setVisible(false);
						dispose();
						//Test
						System.exit(0);
					}
				});

				controlsPanel.add(btnOk);
				controlsPanel.add(btnCancel);
				getContentPane().add(controlsPanel, BorderLayout.SOUTH);
			}

			/**
			 * @param textFieldNames
			 * @param fieldCols
			 */
			private void generatetextFields(
				String[] textFieldNames,
				int[] fieldCols) {
				for (int i = 1; i < fieldCols.length; i++) {
					labels[i] = new JLabel(textFieldNames[i]);
					textFields[i] = new JTextField(fieldCols[i]);
					componentPanel.add(labels[i]);
					componentPanel.add(textFields[i]);
				}
			}
		};

}
 
Original geschrieben von christianSch
mein Problem ist das ich ein Anfänger bin

1. wie koppel ich die 2 Dialoge aneinander- damit dann auch der 2te Dialog beim ok-Button des 1ten Dialoges geöffnet?

2. bei meiner Klasse RandomRange haut auch irgendwas nicht hin.
Hab aber nicht genug Erfahrung/ Praxis & Kenntnisse um zu sehen was da mein Fehler ist

Ui, das ist ja fast wie bei Adam&Eva anzufangen...

zu 1:
auf den OK-Button des ersten Dialogs legst Du doch eine Action mit entsprechender actionPerformed(ActionEvent) Methode.
PseudoCode ungefär so:

Code:
actionPerformed(ActionEvent)
{
 // Anzahl Zeilen aus dem Textfeld auslesen und ablegen
 // Anzahl Spalten aus dem Textfeld auslesen und ablegen
 // 1. Dialog schliessen
 // in einer Schleife immer wieder den zweiten Dialog öffnen (MyDialog.show()) usw.
}

Zu 2 kommen wir später...
 
btnOk = new JButton("OK");
btnOk.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Sammle die Textfeldinhalte ein
setVisible(false);
dispose();
System.out.println("Verarbeite Daten ...");
}
});
 
Original geschrieben von christianSch
btnOk = new JButton("OK");
btnOk.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Sammle die Textfeldinhalte ein
setVisible(false);
dispose();
System.out.println("Verarbeite Daten ...");
}
});


Das sieht ja schon mal gut aus (auch wenn setVisible(false) und dispose() doppelt gemoppelt ist), aber was ist mit
// in einer Schleife immer wieder den zweiten Dialog öffnen (MyDialog.show()) usw.
?
 
Code:
textFields = new JTextField[textFieldNames.length];
labels = new JLabel[textFieldNames.length];

private void generatetextFields
(
	String[] textFieldNames,
	int[] fieldCols) 
	{
	for (int i = 1; i < fieldCols.length; i++) 
		{
		labels[i] = new JLabel(textFieldNames[i]);
		textFields[i] = new JTextField(fieldCols[i]);
		componentPanel.add(labels[i]);
		componentPanel.add(textFields[i]);
		}
	}
};
 
Also das wird mir jetzt zu blöd. Ohne Kommentar:

Hauptklasse:
Code:
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;

public class VariableColumns extends JFrame
{
	private List columnRanges = new ArrayList();
	private VariableColumnsDialog1 variableColumnsDialog1;
	
	public VariableColumns()
	{
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		variableColumnsDialog1 = new VariableColumnsDialog1(this);
	}
	
	public static void main(String[] args)
	{
		VariableColumns VariableColumns = new VariableColumns();
	}

	/**
	 * @param randomRange
	 */
	public void addRandomRange(RandomRange randomRange)
	{
		columnRanges.add(randomRange);
	}

	/**
	 * 
	 */
	public void doWhatYouWantNow()
	{
		variableColumnsDialog1.dispose();
		System.exit(0); // bzw. die gewünschte weitere Verarbeitung...
		
	}
}

Erster Dialog:
Code:
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class VariableColumnsDialog1 extends JDialog
{
	int m_iZeilen = 0;
	int m_iSpalten = 0;
	JLabel jlSpalten = new JLabel("Anzahl Spalten:");
	JLabel jlZeilen = new JLabel("Anzahl Zeilen:");
	JTextField jtSpalten = new JTextField();
	JTextField jtZeilen = new JTextField();
	JButton jbOK = new JButton("OK");
	
	VariableColumns columns;
	
	/**
	 * @throws java.awt.HeadlessException
	 */
	public VariableColumnsDialog1(VariableColumns variableColumns) throws HeadlessException
	{
		super();
		columns = variableColumns;
		setSize(250,250);
		getContentPane().setLayout(new GridLayout(3,2));
		getContentPane().add(jlZeilen);
		getContentPane().add(jtZeilen);
		getContentPane().add(jlSpalten);
		getContentPane().add(jtSpalten);
		getContentPane().add(jbOK);
		jbOK.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent arg0)
			{
				m_iSpalten = Integer.parseInt(jtSpalten.getText());
				m_iZeilen = Integer.parseInt(jtZeilen.getText());
				VariableColumnsDialog2 variableColumnsDialog2 = new VariableColumnsDialog2(m_iSpalten, columns);
			}});
			
		this.show();
	}
}

Zweiter Dialog:
Code:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class VariableColumnsDialog2 extends JDialog
{
	private int m_iSpalten = 0;
	private int m_iBorderLow = 0;
	private int m_iBorderHigh = 0;
	private int iCounter = 1;
	JLabel jlSpalten = new JLabel("Spalte: ");
	JLabel jlSpaltenNummer = new JLabel();
	JLabel jlBorderLow = new JLabel("Untere Schranke: ");
	JLabel jlBorderHigh = new JLabel("Obere Schranke: ");
	JTextField jtBorderLow = new JTextField();
	JTextField jtBorderHigh = new JTextField();
	JButton jbOK = new JButton("OK");
	
	VariableColumns columns;	
	public VariableColumnsDialog2(int iSpalten, VariableColumns variableColumns)
	{
		// diesen Dialog m_iSpalten mal öffnen; zumindest so tun als ob
		super();
		columns = variableColumns;
		m_iSpalten = iSpalten;
		jlSpaltenNummer.setText("1");
		setSize(250,250);
		getContentPane().setLayout(new GridLayout(4,2));
		getContentPane().add(jlSpalten);
		getContentPane().add(jlSpaltenNummer);
		getContentPane().add(jlBorderLow);
		getContentPane().add(jtBorderLow);
		getContentPane().add(jlBorderHigh);
		getContentPane().add(jtBorderHigh);
		getContentPane().add(jbOK);
		jbOK.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent arg0)
			{
				doIt();
			}});
			
		this.show();		
		// zurück zu VariableColumns
	}
	
	private void doIt()
	{
		m_iBorderLow = Integer.parseInt(jtBorderLow.getText());
		m_iBorderHigh = Integer.parseInt(jtBorderHigh.getText());
		RandomRange randomRange = new RandomRange(m_iSpalten, m_iBorderLow, m_iBorderHigh);
		columns.addRandomRange(randomRange);
		// prüfen, ob der Dialog geöffnet bleiben muss, weil noch nicht alle Werte erfasst sind
		if ( iCounter == m_iSpalten )
		{
			iCounter = 0;
			this.hide();
			columns.doWhatYouWantNow();
		}
		else
		{
			iCounter++;
			jlSpaltenNummer.setText(String.valueOf(iCounter));
			jtBorderLow.setText("");
			jtBorderHigh.setText("");
			jtBorderLow.grabFocus();
		}
		
	}
}

Datenklasse:
Code:
public class RandomRange
{
	private int m_iSpaltenIndex;
	private int m_iUntereSchranke;
	private int m_iObereSchranke;
	
	RandomRange(int spaltenIndex, int untereSchranke, int obereSchranke)
	{
		setSpaltenIndex(spaltenIndex);
		setUntereSchranke(untereSchranke);
		setObereSchranke(obereSchranke);
	}
	/**
	 * @return
	 */
	public int getObereSchranke()
	{
		return m_iObereSchranke;
	}

	/**
	 * @return
	 */
	public int getSpaltenIndex()
	{
		return m_iSpaltenIndex;
	}

	/**
	 * @return
	 */
	public int getUntereSchranke()
	{
		return m_iUntereSchranke;
	}

	/**
	 * @param i
	 */
	public void setObereSchranke(int i)
	{
		m_iObereSchranke = i;
	}

	/**
	 * @param i
	 */
	public void setSpaltenIndex(int i)
	{
		m_iSpaltenIndex = i;
	}

	/**
	 * @param i
	 */
	public void setUntereSchranke(int i)
	{
		m_iUntereSchranke = i;
	}
}

Nicht die tollste und sauberste Lösung, aber so geht es z.B.
 
Zurück