2017-11-26 11 views
0

こんにちは私はプログラムに取り組んでいますが、JDialogからいくつかの設定を選択して「OK」をクリックすると問題が発生しました。これは設定が保存されずに元の設定に戻ります。JDialogを終了して設定を保存する方法?

PS:私は英語のスピーカーではないので、上記のテキストでいくつかの間違いを覚えているかもしれません。

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

回答は編集を参照してください。ご不明な点があればお尋ねください。 –

+0

ありがとう、あなたは私をあまりにも助けました。私はプログラムを直接実行するときにShowDrawSettingsを表示したいのですが、どうすればいいですか? –

+0

これは別の質問ですので、別途質問する必要があります。私はあなたの元の質問がここで答えられたと信じています。あなたはその答えを受け入れることを検討すべきです。 –

答えて

2

情報がある、あなただけのユーザーがそれを使用して行われた後、ダイアログからそれを抽出する必要があります。私は上記のコードに少なくとも2つの新しいメソッドを公開しています。getColor()colorsList.getSelectedItem();のメソッド、ユーザーの色の選択(私はオブジェクトのタイプがわからないので、まだメソッドを表示できません) 。また、ユーザーの塗りつぶされた設定を取得し、別の1、おそらく

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

ダイアログがモーダルであるので、あなたは、呼び出し元のコードに目に見えるように設定した直後に、ユーザーがそれを使用して終了したことを知っていますよ。そして、これは上記の方法を呼び出してデータを抽出する場所です。

以下のコードでは、このセクションでこれを示しています: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");     
    } 

(コメントを参照してください):

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"); 
    } 
} 

サイドノート:

  • 私は、ウィンドウのパラメータを受け入れるためにあなたのクラスのコンストラクタを変更しました、 JFrame、JDialogなどの基本クラスであり、スーパーのコンストラクタへの呼び出しを拒否しました。この方法では、ダイアログは呼び出し元コードの真の子ウィンドウです(そうでない場合は、nullに渡すことができます)。
  • ではなく、を使用して、そのコンストラクタ内でダイアログを表示することをお勧めします。これを行うのは呼び出し側コードの責任であり、呼び出し側コードでは、ダイアログを表示した後にダイアログを表示させたくない場合があります(たとえば、表示する前にPropertyChangeListenerを添付する場合など)。これはモーダルダイアログで最も重要ですが、プログラミングの実践には適しています。
  • 私はあなたのコンボボックスに保持されているオブジェクトの型を知らなかったので、デモンストレーション目的でStringの配列を作成しました。
+0

ありがとう、あなたは私をあまりにも助けました。私はプログラムを直接実行するときにShowDrawSettingsを表示したいのですが、どうすればいいですか? –

関連する問題