2017-11-26 2 views
0

Hallo Ich arbeite an einem Programm und ich konfrontiert ein Problem, wenn ich einige Einstellungen aus JDialog wählen, dann klicken Sie auf "OK", das ist, dass die Einstellung nicht gespeichert, aber zurück zu den ursprünglichen Einstellungen.Wie schließe ich JDialog und speichere die Einstellung?

PS: Ich bin kein englischer Sprecher also vielleicht beobachten Sie einige Fehler in meinem Text oben.

Bild enter image description here

class DrawingSettingWindow extends JDialog { 


    public DrawingSettingWindow() { 

     this.setTitle("Drawing Setting Window"); 
     this.setSize(550, 550); 
     this.setLocationRelativeTo(null); 

     this.setModal(true); 

     this.setLayout(new GridLayout(4, 1)); 

     JLabel selectColorText = new JLabel("Select Drawing Color"); 

     colorsList = new JComboBox(colors); 
     JPanel panel1 = new JPanel(); 
     panel1.add(selectColorText); 
     panel1.add(colorsList); 
     add(panel1); 

     JLabel selectStyleText = new JLabel("Select Drawing Style"); 
     JPanel panel2 = new JPanel(); 

     normal = new JRadioButton("Normal"); 
     normal.setSelected(true); 
     filled = new JRadioButton("Filled"); 
     ButtonGroup bg = new ButtonGroup(); 

     bg.add(normal); 
     bg.add(filled); 
     panel2.add(selectStyleText); 
     panel2.add(normal); 
     panel2.add(filled); 
     add(panel2); 

     JButton ok = new JButton("OK"); 

     add(ok); 

     ok.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       setVisible(false); 
      } 
     }); 




     this.pack(); 
     this.setVisible(true); 

    } 
+0

Bitte lesen Sie die Antworten zu beantworten. Bitte fragen Sie nach eventuellen Fragen. –

+0

danke, du hast mir zu viel geholfen. Ich möchte (ShowDrawSettings) zeigen, wenn ich das Programm direkt ausführe, wie geht das? –

+0

Das ist eine separate Frage und muss separat gestellt werden. Ich glaube, dass Ihre ursprüngliche Frage hier beantwortet wurde, und Sie sollten in Betracht ziehen, die Antwort zu akzeptieren. –

Antwort

2

Die Informationen sind da, man muss es nur aus dem Dialog extrahieren, nachdem der Benutzer es mit gemacht wird. Ich würde den Code oben mindestens zwei neue Methoden geben, eine öffentliche getColor() Methode, die colorsList.getSelectedItem(); zurückgibt, die Farbauswahl des Benutzers (ich bin mir nicht sicher, welche Art von Objekt das ist, so kann ich die Methode noch nicht zeigen) . Auch ein anderer, der der Benutzers gefüllte Einstellung bekommt, vielleicht

public boolean getFilled() { 
    return filled.isSelected(); 
} 

Da der Dialog modal ist, werden Sie wissen, dass der Benutzer es beendet hat, sofort zu verwenden, nachdem Sie es sichtbar im Telefonvorwahl eingestellt. Und hier rufen Sie die oben genannten Methoden zum Extrahieren der Daten auf.

Im folgenden Code habe ich dies in diesem Abschnitt gezeigt: drawingSettings.setVisible (true);

 // here you extract the data 
     Object color = drawingSettings.getColor(); 
     boolean filled = drawingSettings.getFilled(); 
     textArea.append("Color: " + color + "\n"); 
     textArea.append("Filled: " + filled + "\n");     
    } 

Zum Beispiel (siehe Kommentare):

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.Window; 
import java.awt.Dialog.ModalityType; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class UseDrawingSettings extends JPanel { 
    private JTextArea textArea = new JTextArea(20, 40); 
    private DrawingSettingWindow drawingSettings; 

    public UseDrawingSettings() { 
     JPanel topPanel = new JPanel(); 
     topPanel.add(new JButton(new ShowDrawSettings())); 
     setLayout(new BorderLayout()); 

     add(new JScrollPane(textArea)); 
     add(topPanel, BorderLayout.PAGE_START); 
    } 

    private class ShowDrawSettings extends AbstractAction { 
     public ShowDrawSettings() { 
      super("Get Drawing Settings"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (drawingSettings == null) { 
       Window win = SwingUtilities.getWindowAncestor(UseDrawingSettings.this); 
       drawingSettings = new DrawingSettingWindow(win); 
      } 
      drawingSettings.setVisible(true); 

      // here you extract the data 
      Object color = drawingSettings.getColor(); 
      boolean filled = drawingSettings.getFilled(); 
      textArea.append("Color: " + color + "\n"); 
      textArea.append("Filled: " + filled + "\n");     
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     UseDrawingSettings mainPanel = new UseDrawingSettings(); 
     JFrame frame = new JFrame("UseDrawingSettings"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 
} 

@SuppressWarnings("serial") 
class DrawingSettingWindow extends JDialog { 

    private static final String TITLE = "Drawing Setting Window"; 
    private JComboBox<String> colorsList; 
    private JRadioButton normal; 
    private JRadioButton filled; 

    // not sure what colors is, but I'll make it a String array for testing 
    private String[] colors = {"Red", "Orange", "Yellow", "Green", "Blue"}; 


    public DrawingSettingWindow(Window win) { 
     super(win, TITLE, ModalityType.APPLICATION_MODAL); 
     // this.setTitle("Drawing Setting Window"); 
     this.setSize(550, 550); // !! this is not recommended 
     this.setLocationRelativeTo(null); 

     this.setModal(true); 

     this.setLayout(new GridLayout(4, 1)); 

     JLabel selectColorText = new JLabel("Select Drawing Color"); 

     colorsList = new JComboBox(colors); 
     JPanel panel1 = new JPanel(); 
     panel1.add(selectColorText); 
     panel1.add(colorsList); 
     add(panel1); 

     JLabel selectStyleText = new JLabel("Select Drawing Style"); 
     JPanel panel2 = new JPanel(); 

     normal = new JRadioButton("Normal"); 
     normal.setSelected(true); 
     filled = new JRadioButton("Filled"); 
     ButtonGroup bg = new ButtonGroup(); 

     bg.add(normal); 
     bg.add(filled); 
     panel2.add(selectStyleText); 
     panel2.add(normal); 
     panel2.add(filled); 
     add(panel2); 

     JButton ok = new JButton("OK"); 

     add(ok); 

     ok.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       setVisible(false); 
      } 
     }); 

     this.pack(); 
     // this.setVisible(true); // this should be the calling code's responsibility 

    } 

    public Object getColor() { 
     return colorsList.getSelectedItem(); 
    } 

    public boolean getFilled() { 
     return filled.isSelected(); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Foo"); 
    } 
} 

Side Hinweise:

  • Ich habe Ihre Klasse Konstruktor geändert, um einen Fensterparameter zu akzeptieren, die Basisklasse für JFrame, JDialog und so, und a Ging einen Anruf an den Konstruktor des Super. Auf diese Weise ist das Dialogfeld ein echtes untergeordnetes Fenster des aufrufenden Codes (oder Sie können null übergeben, wenn Sie es nicht möchten).
  • Ich empfehle nicht machen den Dialog sichtbar in seinem Konstruktor. Es liegt in der Verantwortung des aufrufenden Codes, dies zu tun, und es gibt Fälle, in denen der aufrufende Code den Dialog nach dem Erstellen nicht sichtbar machen möchte, zum Beispiel wenn er einen PropertyChangeListener anfügen wollte, bevor er sichtbar gemacht wird. Dies ist am wichtigsten für modale Dialoge, aber es ist nur eine gute Programmierpraxis.
  • Ich kannte den Typ der Objekte nicht, die von Ihrem Kombinationsfeld gehalten wurden, und machte daher ein Array von String für Demonstrationszwecke.
+0

danke, du hast mir zu viel geholfen. Ich möchte (ShowDrawSettings) zeigen, wenn ich das Programm direkt ausführe, wie geht das? –