0

我的问题与 java swing frame 有关。我有两个jframe。jframe1 和 jframe2。jframe1中有一个jbutton,当用户单击jbutton时我想显示jframe 2.jframe2有一个文本框,jbutton用户可以在文本框中输入值,当用户单击jbutton时,我想将焦点设置为第一个jframe并传递用户在 jrame1 中输入了 jlable 的值。请帮助我做到这一点。

4

1 回答 1

2

在我看来,第二帧更像是一个对话框,用于输入一个值,然后将其返回给调用者(第一帧)。

为此,您创建一个 modal JDialog,在其中添加控件(文本字段,确定,也许还有一个取消按钮)并添加一个打开对话框(阻止调用者)并返回输入的文本的方法,除非它被取消。这样,您可以直接传递输入的文本,而不必将其临时存储到变量中(这通常是不好的做法)。

这是这样一个对话框的简单实现:

public class SwingTestDialog extends JDialog {

    private JTextField text;
    private boolean cancelled = true;

    public static void main (String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run () {
                SwingTestDialog dialog = new SwingTestDialog();
                String text = dialog.selectValue();
                System.out.println("Selected: " + text);
            }
        });
    }

    public SwingTestDialog () {
        setModal(true);
        setTitle("Please enter something");
        JPanel content = new JPanel();
        content.setLayout(new BorderLayout(10, 10));
        getContentPane().add(content);

        text = new JTextField();
        JButton ok = new JButton("Accept");
        JButton cancel = new JButton("Cancel");
        JPanel buttons = new JPanel();
        buttons.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
        buttons.add(ok);
        buttons.add(cancel);

        content.add(text, BorderLayout.NORTH);
        content.add(buttons, BorderLayout.SOUTH);
        content.setBorder(new EmptyBorder(15, 15, 15, 15));
        pack();

        ok.addActionListener(new ActionListener() {

            public void actionPerformed (ActionEvent e) {
                cancelled = false;
                dispose();
            }
        });
        cancel.addActionListener(new ActionListener() {

            public void actionPerformed (ActionEvent e) {
                cancelled = true;
                dispose();
            }
        });
        // default button, allows to trigger ok when pressing enter in the text field
        getRootPane().setDefaultButton(ok);
    }

    /**
     * Open the dialog (modal, blocks caller until dialog is disposed) and returns the entered value, or null if
     * cancelled.
     */
    public String selectValue () {
        setVisible(true);
        return cancelled ? null : text.getText();
    }
}
于 2013-08-19T16:33:52.383 回答