Problem mit Interaktion JFrame mit JDialog

  • Themenstarter Themenstarter ByeBye 190166
  • Beginndatum Beginndatum
B

ByeBye 190166

Mal wieder ein neues Problem.
Ich habe ein JMenu mit JMenuItems.
Ein Klick auf ein JMenuItem öffnet einen JDialog zur Farbauswahl.
Man kann einen JRadioButton selektieren (JRadioButton in Buttongroup) und legt damit die Farbe fest. Nach Klick auf den OkButton soll nun die ausgewählte Farbe an das JFrame übergeben werden und der JDialog geschlossen werden.
Problem 1 : Wie den Wert übergeben ? (Das geht schon irgendwie z.B. als Variable im JFrame der von JDialog geschrieben wird. In JDialog geht´s nicht; der Wert wäre bei Schliessen des JDialogs verloren)
Problem 2 : Wann ist der neue Wert gültig ?:confused::confused:
Das JFrame müßte über die Beendigung der Auswahl bzw. die Auswahl des OkButtons und das Schliessen des JDialogs informiert werden. JDialog ist Modal. Also EventListener in JFrame der bei Schliessen des JDialog aufgerufen wird ?
Das könnte irgendwie gehen, aber wie lässt sich das realisieren ?
 
Hallo,

wenn es nur um Auswahl einer Farbe geht, gibt es in Swing eine passende Komponente - JColorChooser. Der Aufruf ist statisch und als Rückgabewert erhälst Du die ausgewählte Farbe. Wenn der Benutzer auf "Abbrechen" geklickt hat, bekommst Du null zurück:
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

/**
 * The Class ColorChooserTest.
 */
public class ColorChooserTest extends JFrame {

    /**
     * Create a new instance of <code>ColorChooserTest</code>.
     */
    public ColorChooserTest() {
        super("ColorChooserTest");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        final JMenuBar menuBar = new JMenuBar();
        final JMenu menuFile = new JMenu("File");
        menuBar.add(menuFile);
        final JMenuItem menuItemColor = new JMenuItem("Choose Color");
        menuFile.add(menuItemColor);
        setJMenuBar(menuBar);

        menuItemColor.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                final Color newColor = JColorChooser.showDialog(
                        ColorChooserTest.this, "Select Color", null);
                if (newColor == null) {
                    return;
                }
                getContentPane().setBackground(newColor);
            }
        });
    }

    /**
     * The main method.
     *
     * @param args the arguments
     */
    public static void main(String[] args) {
        final JFrame frame = new ColorChooserTest();
        final Dimension frameSize = new Dimension(600, 400);
        frame.setSize(frameSize);
        final Dimension screenSize =
            Toolkit.getDefaultToolkit().getScreenSize();
        final int frameX = (screenSize.width - frameSize.width) / 2;
        final int frameY = (screenSize.height - frameSize.height) / 2;
        frame.setLocation(frameX, frameY);
        frame.setVisible(true);
    }
}

Grüße
Vincent
 
Wenn es nur so einfach wäre

Darum geht es nicht. Die Farben sind in einem enum definiert. Jeder Farbe entspricht eine bestimmte Grafik. Halt selbst definiert. Soll ein kleines Othello bzw. Reversi-Spiel werden.
Man lernt dadurch ungemein und stößt immer wieder auf Probleme an die man vorher nicht gedacht hat. Wie schon gesagt, das Problem ist die Interaktion zwischen dem JFrame und dem JDialog. Was im JDialog definiert wird, ist grundsätzlich unbedeutend.
 
Hallo,

ich hoffe mal dein Problem richtig verstanden zu haben.

du kannst du den Wert in deiner Dialog-Klasse in einer Klassenvariable abspeichern. Diese kannst du dann über eine Getter-Methode außen zur Verfügung stellen. Wenn ich mich richtig erinnere, dürfte dein JFrame auch nicht weiter arbeiten solange der Dialog geöffnet ist. Also könntest du direkt nach dem Aufruf deines Dialoges, die Getter-Methode aufrufen und so an den Wert kommen.

Java:
package de.tutorials;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class MainFrame extends JFrame {
	


	public MainFrame() {
		JButton button = new JButton("button");
		
		button.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				MyDialog dialog = new MyDialog(MainFrame.this);
				
				dialog.setVisible(true);
				System.out.println(dialog.getText());
				
			}
			
		});
		
		setSize(200,200);
		setLayout(null);
		setLocationRelativeTo(null);
		
		button.setBounds(10, 10, 100, 20);
		
		add(button);
	}
	
	public static void main(String[] args) {
		new MainFrame().setVisible(true);
	}
}


Java:
public class MyDialog extends JDialog{
	
	
	private String text;
	
	private JTextField textField = new JTextField();
	
	public MyDialog(JFrame frame) {
		super(frame,"TEST",true);
		
		setSize(300, 300);
		setLocationRelativeTo(frame);
		
		JButton button = new JButton("schließen");
		
		button.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				text = textField.getText();
				dispose();
			}
			
		});
		
		setLayout(null);
		
		textField.setBounds(10, 10, 100, 20);
		button.setBounds(10, 230, 100, 20);
		
		add(textField);
		add(button);
	}

	/**
	 * @return the text
	 */
	public String getText() {
		return text;
	}
}


MFG

zEriX
 
Zurück