2012-03-31 4 views
4

は基本的に、私はこのコード行がボタンから閉じるJavaスイングウィンドウから値を返す方法はありますか?

editwindow clubeditwindow = new editwindow(1,"Club Edit"); 

と呼ばれている。このラインは基本的にメインクラスからの情報の束を編集することができ、新しいJFrameのを開くところ私のメインのコードのどこかに持っています。保存とキャンセルという2つのボタンがあります。 saveをクリックすると、テキストフィールドから値を取り出し、それを新しいオブジェクトに入れてメインクラスに返し、ウィンドウを閉じたいと思っています。キャンセルをクリックすると、何もしないようにします。これは簡単です。

ありがとうございます。

+0

に表示されているのJPanelを保持PlayerEditorPanel.java Javaの命名規則を学び、あなたがのJOptionPaneでそれを行うことができ – kleopatra

答えて

10

ウィンドウをJFrameとして表示せず、モーダルダイアログとして表示します。そして、もはや目に見えなくなった後で、メインのGUIは、それが保持している情報についてオブジェクトに問い合わせることができる。これを行う最も簡単な方法は、JOptionPaneを使用することです.JOptionPaneを正しく使用すると、賢い小さな獣です。

ここに私が意味するものの例があります。 JOptionPaneは、GridBagLayoutを使用して情報を表示するJPaneを保持します。

ComplexOptionPane.java:メインのJFrameを表示します。

import java.awt.event.*; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ComplexOptionPane extends JPanel { 
    private PlayerEditorPanel playerEditorPanel = new PlayerEditorPanel(); 
    private JTextArea textArea = new JTextArea(20, 40); 

    public ComplexOptionPane() { 
     add(new JScrollPane(textArea)); 
     add(new JButton(new AbstractAction("Get Player Information") { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      int result = JOptionPane.showConfirmDialog(null, playerEditorPanel, 
        "Edit Player", JOptionPane.OK_CANCEL_OPTION, 
        JOptionPane.PLAIN_MESSAGE); 
      if (result == JOptionPane.OK_OPTION) { 
       for (PlayerEditorPanel.FieldTitle fieldTitle : 
        PlayerEditorPanel.FieldTitle.values()) { 
        textArea.append(String.format("%10s: %s%n", fieldTitle.getTitle(), 
         playerEditorPanel.getFieldText(fieldTitle))); 
       } 
      } 
     } 
     })); 
    } 

    private static void createAndShowGui() { 
     ComplexOptionPane mainPanel = new ComplexOptionPane(); 

     JFrame frame = new JFrame("ComplexOptionPane"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

のJOptionPane

import java.awt.*; 
import java.util.HashMap; 
import java.util.Map; 
import javax.swing.*; 

@SuppressWarnings("serial") 
class PlayerEditorPanel extends JPanel { 
    enum FieldTitle { 
     NAME("Name"), SPEED("Speed"), STRENGTH("Strength"); 
     private String title; 

     private FieldTitle(String title) { 
     this.title = title; 
     } 

     public String getTitle() { 
     return title; 
     } 
    }; 

    private static final Insets WEST_INSETS = new Insets(5, 0, 5, 5); 
    private static final Insets EAST_INSETS = new Insets(5, 5, 5, 0); 
    private Map<FieldTitle, JTextField> fieldMap = new HashMap<FieldTitle, JTextField>(); 

    public PlayerEditorPanel() { 
     setLayout(new GridBagLayout()); 
     setBorder(BorderFactory.createCompoundBorder(
      BorderFactory.createTitledBorder("Player Editor"), 
      BorderFactory.createEmptyBorder(5, 5, 5, 5))); 
     GridBagConstraints gbc; 
     for (int i = 0; i < FieldTitle.values().length; i++) { 
     FieldTitle fieldTitle = FieldTitle.values()[i]; 
     gbc = createGbc(0, i); 
     add(new JLabel(fieldTitle.getTitle() + ":", JLabel.LEFT), gbc); 
     gbc = createGbc(1, i); 
     JTextField textField = new JTextField(10); 
     add(textField, gbc); 

     fieldMap.put(fieldTitle, textField); 
     } 
    } 

    private GridBagConstraints createGbc(int x, int y) { 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.gridwidth = 1; 
     gbc.gridheight = 1; 

     gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST; 
     gbc.fill = (x == 0) ? GridBagConstraints.BOTH 
      : GridBagConstraints.HORIZONTAL; 

     gbc.insets = (x == 0) ? WEST_INSETS : EAST_INSETS; 
     gbc.weightx = (x == 0) ? 0.1 : 1.0; 
     gbc.weighty = 1.0; 
     return gbc; 
    } 

    public String getFieldText(FieldTitle fieldTitle) { 
     return fieldMap.get(fieldTitle).getText(); 
    } 

} 
+0

それらに固執してください?まあありがとう= D。 – gammaraptor

+0

@gammaraptor:上記の例のコードを参考にしてください。 –

+0

@gammaraptor:ダイアログに複数のテキストフィールドを追加する方法を尋ねました。答えは:複数のJTextFieldをJPanelに追加できる場合は、JPanelをJOptionPane(上記のように)またはJDialogに表示できます。 –

関連する問題