variabler Dialog

ZAntjeZ

Mitglied
Hallo,

ich möchte einen Dialog machen, der abhängig ist von der Anzahl der Werte, die vom Benutzer vorher eingegebn wurden. Die Anzahl wird in einem vorhergehenden Dialog abgefragt, und funktioniert auch.
Nun sollen im weiteren Dialog soviele Eingabefelder erscheinen wie Anzahl Werte eingegeben wurden.

Mein Quellcode (Ausschnitt):
Code:
Label[] label=null;
JTextField[] text=null;
setSize(250,100+anzWerte*40);
	
for(int i=1;i<=anzWerte;i++)
{
label[i]=new Label("Werte "+i+": ");
text[i]=new JTextField();
text[i].setBounds(100,100+(40*i),100,25);
	
dialogPanel.setLayout(new GridLayout(anzWerte*2,0));
dialogPanel.add(label[i]);
dialogPanel.add(text[i]);
}

der Quellcode geht nicht.
(nur OK und AbrechenButton werden angezeigt, die ich ausserhalb dieser Schleife implementiert habe).

Kann mir jemand helfen?
 
Zuletzt bearbeitet:
ZAntjeZ hat gesagt.:
Hallo,

ich möchte einen Dialog machen, der abhängig ist von der Anzahl der Werte, die vom Benutzer vorher eingegebn wurden. Die Anzahl wird in einem vorhergehenden Dialog abgefragt, und funktioniert auch.
Nun sollen im weiteren Dialog soviele Eingabefelder erscheinen wie Anzahl Werte eingegeben wurden.

Mein Quellcode (Ausschnitt):
Code:
Label[] label=null;
JTextField[] text=null;
setSize(250,100+anzWerte*40);
	
for(int i=1;i<=anzWerte;i++)
{
label[i]=new Label("Werte "+i+": ");
text[i]=new JTextField();
text[i].setBounds(100,100+(40*i),100,25);
	
dialogPanel.setLayout(new GridLayout(anzWerte*2,0));
dialogPanel.add(label[i]);
dialogPanel.add(text[i]);
}


der Quellcode geht nicht.
(nur OK und AbrechenButton werden angezeigt, die ich ausserhalb dieser Schleife implementiert habe).

Kann mir jemand helfen?

Du hast ein paar kapitale Fehler eingebaut.:

1)
Code:
Label[] label=null;
JTextField[] text=null;

und greifst fröhlich auf die nicht vorhandenen Indizes zu:
Code:
label[i]=new Label("Werte "+i+": ");
text[i]=new JTextField();

Ohne Festlegung, wie groß die Arrays sein sollen, fliegt Dir der Coder hier um die Ohren.
Abhilfe:
Code:
Label[] label= new Label[anzWerte];
JTextField[] text=new JTextField[anzWerte];

2)
Durch diese Festlegung der Anzahl wirft die for-Schleife eine ArrayIndexOutOfBoundsException:
Code:
int i = 1; i<=anzWerte; i++

Ein Array beginnt immer mit dem Index 0. 10 Werte bedeutet Index 0 bis 9, während Du auf 1-10 zugreifst. Die 10 ist somit aus dem Ruder und wirft eine ArrayIndexOutOfBoundsException
Korrektur:
Code:
for(int i = 0; i < anzWerte; i++)

Und last not least
3)
Code:
dialogPanel.setLayout(new GridLayout(anzWerte*2,0));

das gehört oberhalb der for-Schleife, da hier keine Laufvariable verwendet wird.

Übrigens: Die Verwendung einer IDE wie JBuilder oder Eclipse hätte diese Frage erübrigt, da sie Grund und Stelle anzeigen, wo es kracht.
 
Hallo!

Versuchs mal hiermit:

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;

/**
 * @author      Darimont<br>
 * @version     1.0<br>
 * Date of creation:  01.06.2004<br>
 * File:         DialogTest.java<br>
 * Modifier:     Darimont<br>
 * Revision:     Revision<br>
 * State:        Germany<br>
 */

public class DialogTest {

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

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

		Arrays.fill(fieldCols, defaultTextfieldSize);

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

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

	}

	/**
	 * @param fieldNames
	 * @param fieldCols
	 */
	private void doIt(String[] fieldNames, int[] fieldCols) {
		// TODO Auto-generated method stub
		new CustomDialog("MyCustomDialog", 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 = 0; i < fieldCols.length; i++) {
				labels[i] = new JLabel(textFieldNames[i]);
				textFields[i] = new JTextField(fieldCols[i]);
				componentPanel.add(labels[i]);
				componentPanel.add(textFields[i]);
			}
		}
	};
}

Gruß Tom
 
Hallo!

Denke das Beispiel ergibt sich von selbst. Ich meine da steht ja kein hoch komplexer Algorithmus hinter den man hoch und breit erklären müsste...
dass passt so schon. Ausserdem schreibe ich nur Kommentare wenn ich dafür bezahlt werde*g* ;-)

Gruß Tom
 
Zurück