Swing eigener InputDialog

Curry

Aktives Mitglied
Moin Moin!

Ich erstelle einen JDialog über den man MC-Fragen erstellen kann. Dieser Dialog wird über mein MainFrame geöffnet und soll ein Question-Objekt zurück geben, wenn in dem Dialog auf "add" gedrückt wurde.

Das ganze soll analog wie in dem Beispiel des Java-Tutorials funktionieren:
Java:
String s = (String)JOptionPane.showInputDialog(
                    frame,
                    "Complete the sentence:\n"
                    + "\"Green eggs and...\"",
                    "Customized Dialog",
                    JOptionPane.PLAIN_MESSAGE,
                    icon,
                    possibilities,
                    "ham");

Um mein Code zum Zeigen zu vereinfachen, habe ich das Question-Objekt durch eine ArrayList<String> ersetzt.

Derzeit schaut die Klasse QuestionDialog so aus:
Java:
public class QuestionDialog extends JDialog implements ActionListener {

	JTextArea question_area;
	ArrayList<JLabel> answer_label = new ArrayList<JLabel>();
	ArrayList<JTextField> answer_field = new ArrayList<JTextField>();

	public QuestionDialog(JFrame owner, String title, boolean modal) {
		super(owner, title, modal);

//		setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		
		initComponents();
		pack();
		setResizable(false);
		setLocationRelativeTo(null);
		
	}

	private void initComponents() {
		Container cp = getContentPane();
		cp.setLayout(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.insets = new Insets(3,3,3,3);
		gbc.anchor = GridBagConstraints.FIRST_LINE_START;

		JLabel question_label = new JLabel("Frage:");
		gbc.gridy = 0;
		gbc.gridx = 0;
		cp.add(question_label, gbc);

		question_area = new JTextArea(5, 20);
		gbc.gridy = 0;
		gbc.gridx = 1;
		cp.add(question_area, gbc);

		int n = 5; // Anzahl der Antwortmöglichkeiten

		for(int i = 0; i < n; i++) {
			JLabel label = new JLabel( "Antwort " + (i+1) + ":" );
			gbc.gridy = i + 1;
			gbc.gridx = 0;
			cp.add(label, gbc);

			JTextField field = new JTextField(20);
			gbc.gridx = 1;
			cp.add(field, gbc);

			answer_label.add(label);
			answer_field.add(field);
		}

		
		JButton buttonAdd = new JButton("add");
		buttonAdd.addActionListener(this);
		
		JPanel panel = new JPanel();
		panel.add(buttonAdd);
		gbc.gridy = n + 1;
		gbc.gridx = 1;
		cp.add(panel, gbc);
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		if (event.getActionCommand().equals("add")) {

			ArrayList<String> list = new ArrayList<String>(); // TODO: die ArrayList muss durch ein richtiges Fragen-Objekt ersetzt werden
			list.add( question_area.getText() );

			for(int i = 0; i < answer_field.size(); i++) {
				list.add( answer_field.get(i).getText() );
			}

			System.out.println( list.toString() );

		}
	}
}

Die Methode
Code:
actionPerformed
in meiner MainFrame-Klasse schaut so aus:
Java:
@Override
	public void actionPerformed(ActionEvent event) {
		if (event.getActionCommand().equals("Neue Frage")) {

			// aktuell
			QuestionDialog dialog = new QuestionDialog(this, "Frage", true);
			dialog.setVisible(true);

			// Ziel
			 /*
			Zum Beispiel irgendwie sowas:
			ArrayList<String> list (ArrayList<String>) MyDialogLoad.showQuestionDialog(this, "Frage", true);
			 */

		} else if (event.getActionCommand().equals("Beenden")) {
			System.exit(0);
		}
	}

Hat jemand einen Tipp wie ich das hinbekomme? Am besten so, dass ich das auch für andere Dialog verwenden könnte.
 

Curry

Aktives Mitglied
Ich möchte den Dialog im Hauptfenster so aufrufen, dass ich dies in einer Zeile tun kann und beim schließen des modalen Dialogs gleich den Wert des erstellten Objektes im Hauptfenster zur Verfügung habe.

Also so wie bei
Code:
String s = (String) JOptionPane.showInputDialog(...)
. Ich werde in meinem Programm mehrere komplexere eigene Dialoge haben, die aber immer ein Objekt definiertes zurück geben. Um um den Code möglichst einfach und übersichtlich zu halten, würde ich den Aufruf gerne analog gestalten.

Der Wert des erstellten Objektes ist in diesem Beispiel erstmal eine ArrayList<String> und wird später ein eigenes Question-Objekt.

Ich habe es mal mit einer statischen DialogLoader-Klasse versucht, aber in der sind so viele Fehler, dass das Programm so gar nicht erst startet. ;-)

Java:
public class DialogLoader implements WindowListener {

	private Object value;

	public static Object showQuestionDialog(JFrame owner, String title) {

		QuestionDialog dialog = new QuestionDialog(owner, title, true);
		dialog.addWindowListener(this);
		dialog.setVisible(true);
		value = new ArrayList<String>();
        return value;
    }

	@Override
	public void windowActivated(WindowEvent e) {}

	@Override
	public void windowClosed(WindowEvent e) {}

	@Override
	public void windowClosing(WindowEvent e) {
		QuestionDialog dialog = (QuestionDialog) e.getSource();
		value = dialog.getQuestion();
	}

	@Override
	public void windowDeactivated(WindowEvent e) {}

	@Override
	public void windowDeiconified(WindowEvent e) {}

	@Override
	public void windowIconified(WindowEvent e) {}

	@Override
	public void windowOpened(WindowEvent e) {}
}
 

Michael...

Top Contributor
Eine Nachprogrammierung der Funktionalität der JOptionPane Dialoge ist nicht so ohne. Wird so ein Dialog angezeigt läuft einiges (recht komplexes) im Hintergrund ab.

Komplexere Dialoge würde ich mit einem modalen JDialog abbilden. Dann muss man allerdings mit Listenern arbeiten und auf die Rückgabe von Informationen mittels Return-Value verzichten.
 
G

Gast2

Gast
Du kannst der JOptionPane auch einen eigenes JPanel/JComponent mitgeben für den Inhalt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
K eigener button in swing AWT, Swing, JavaFX & SWT 3
T Event Handling JLabel als eigener Button AWT, Swing, JavaFX & SWT 7
A Drag and Drop eigener Objekte AWT, Swing, JavaFX & SWT 7
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
S Eigener Syntax Highlighter - Problem AWT, Swing, JavaFX & SWT 5
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
N 2D-Grafik RTF in eigener JComponent AWT, Swing, JavaFX & SWT 2
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
frankred Swing Eigener ListCellRenderer D'n'D "MOVE" - Mauszeiger flackert AWT, Swing, JavaFX & SWT 14
N jComboBox und eigener Datentyp AWT, Swing, JavaFX & SWT 8
Q Eigener Colorchooser AWT, Swing, JavaFX & SWT 2
V LayoutManager Eigener LayoutManager funktioniert nicht. AWT, Swing, JavaFX & SWT 5
L Swing Falscher Wert nach eigener Sortierung (JTable) AWT, Swing, JavaFX & SWT 2
R JTable - eigener Editor - Mouse events AWT, Swing, JavaFX & SWT 2
S Mit eigener Klasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
N Eigener Grafik Editor mit fehlerhafter Anzeige AWT, Swing, JavaFX & SWT 4
O Eigener Button AWT, Swing, JavaFX & SWT 8
data89 Eigener Button variiert in der Größe - Hilfee! AWT, Swing, JavaFX & SWT 5
A Nimbus eigener Painter funzt nicht AWT, Swing, JavaFX & SWT 11
O AWT Zeichne mit eigener Farbe AWT, Swing, JavaFX & SWT 3
A Aufrufen eigener Klasse AWT, Swing, JavaFX & SWT 8
J eigener Layoutmanager? AWT, Swing, JavaFX & SWT 6
M Eigenes ActionEvent / Eigener Listener AWT, Swing, JavaFX & SWT 2
G SWT DatePicker funzt nicht in eigener Anwendung AWT, Swing, JavaFX & SWT 5
J Problem mit eigener Titelleiste und MouseMotionListener AWT, Swing, JavaFX & SWT 2
F Eigener Observer? AWT, Swing, JavaFX & SWT 4
H eigener Editor und JList als PopMenu AWT, Swing, JavaFX & SWT 6
M Brauche Hilfe zum Einbinden von eigener Schrfitart AWT, Swing, JavaFX & SWT 3
m@nu Problem mit eigener TableCellEditor-Impelemtierung AWT, Swing, JavaFX & SWT 5
clemson Edtor mit anzeigen eigener Tags AWT, Swing, JavaFX & SWT 8
V SWT eigener Renderer? + wo gibts die Sourcen für SWT AWT, Swing, JavaFX & SWT 2
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
R Passwortabfrage entsprechend zu InputDialog AWT, Swing, JavaFX & SWT 2
C mehrere Eingabefelder in InputDialog AWT, Swing, JavaFX & SWT 17
G InputDialog AWT, Swing, JavaFX & SWT 16
L (jface) InputDialog erweitern. AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben