Java 如何从父JFrame访问JDialog信息?

Java 如何从父JFrame访问JDialog信息?,java,swing,jframe,listener,jdialog,Java,Swing,Jframe,Listener,Jdialog,**我已根据收到的帮助和评论更新了我的问题。现在我的问题是: 调用以下代码后: SearchBox searchBox = new SearchBox(); // SearchBox extends JDialog int state = searchBox.showSearchDialog(); // Sets visible to true and returns state 我想让用户在搜索框JDialog中输入输入。所以,在调用searchBox.showSearchDialog时,基

**我已根据收到的帮助和评论更新了我的问题。现在我的问题是: 调用以下代码后:

SearchBox searchBox = new SearchBox(); // SearchBox extends JDialog
int state = searchBox.showSearchDialog(); // Sets visible to true and returns state
我想让用户在搜索框JDialog中输入输入。所以,在调用searchBox.showSearchDialog时,基本上停止我的JFrame类,难道它不应该这样做吗??它甚至在调用setVisibletrue之后都不会出现。然后,一旦用户在JDialog searchBox类中按下OK,就恢复我的JFrame类,并调用字符串query=searchBox.getQuery

我认为sine setVisibletrue是从searchBox调用的。showSearchDialog方法应该停止,但它没有。我的代码仅从以下位置运行:

seachBox = new SearchBox();
int state = seachBox.showSeachDialog();
String query = searchBox.getQuery();
不停地。因此,我的查询字符串返回时完全错误,因为在我的代码调用该方法之前,用户从未有机会输入任何内容

JFrame类:

@抑制警告序列 公共类数据持久性扩展JFrame {

现在,JDialogSearch框出现。下面是完整的类:

import java.awt.BorderLayout;

@SuppressWarnings("serial")
public class SearchBox extends JDialog
{
private final JPanel contentPanel = new JPanel();
private JTextField textFieldGUID;
private JTextField textFieldTitle;
private JTextField textFieldCallsFor;
private JTextField textFieldContains;
public static final int OK_STATE = 0;
public static final int CANCEL_STATE = 1;
private int state = CANCEL_STATE;
String query;

/**
 * Launch the application.
 */
public static void main(String[] args)
{
    try
    {
        SearchBox dialog = new SearchBox();
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.setVisible(true);
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

/**
 * Create the dialog.
 */
public SearchBox()
{
    setBounds(100, 100, 350, 300);
    getContentPane().setLayout(new BorderLayout());
    contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
    getContentPane().add(contentPanel, BorderLayout.WEST);
    GridBagLayout gbl_contentPanel = new GridBagLayout();
    gbl_contentPanel.columnWidths = new int[]
    { 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20 };
    gbl_contentPanel.rowHeights = new int[]
    { 34, 0, 0, 0, 0, 0, 0, 0, 20 };
    gbl_contentPanel.columnWeights = new double[]
    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0,
            Double.MIN_VALUE };
    gbl_contentPanel.rowWeights = new double[]
    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE };
    contentPanel.setLayout(gbl_contentPanel);

    JLabel lblNewLabel = new JLabel("Recipe Search");
    lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 15));
    GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
    gbc_lblNewLabel.anchor = GridBagConstraints.NORTH;
    gbc_lblNewLabel.gridwidth = 14;
    gbc_lblNewLabel.insets = new Insets(0, 0, 5, 0);
    gbc_lblNewLabel.gridx = 0;
    gbc_lblNewLabel.gridy = 0;
    contentPanel.add(lblNewLabel, gbc_lblNewLabel);

    final JCheckBox chckbxGuid = new JCheckBox("GUID");
    GridBagConstraints gbc_chckbxGuid = new GridBagConstraints();
    gbc_chckbxGuid.anchor = GridBagConstraints.WEST;
    gbc_chckbxGuid.insets = new Insets(0, 0, 5, 5);
    gbc_chckbxGuid.gridx = 0;
    gbc_chckbxGuid.gridy = 1;
    contentPanel.add(chckbxGuid, gbc_chckbxGuid);

    textFieldGUID = new JTextField();
    GridBagConstraints gbc_textField = new GridBagConstraints();
    gbc_textField.gridwidth = 11;
    gbc_textField.insets = new Insets(0, 0, 5, 5);
    gbc_textField.fill = GridBagConstraints.HORIZONTAL;
    gbc_textField.gridx = 2;
    gbc_textField.gridy = 1;
    contentPanel.add(textFieldGUID, gbc_textField);
    textFieldGUID.setColumns(10);

    final JCheckBox chckbxTitle = new JCheckBox("Title");
    GridBagConstraints gbc_chckbxTitle = new GridBagConstraints();
    gbc_chckbxTitle.anchor = GridBagConstraints.WEST;
    gbc_chckbxTitle.insets = new Insets(0, 0, 5, 5);
    gbc_chckbxTitle.gridx = 0;
    gbc_chckbxTitle.gridy = 2;
    contentPanel.add(chckbxTitle, gbc_chckbxTitle);

    textFieldTitle = new JTextField();
    GridBagConstraints gbc_textField_1 = new GridBagConstraints();
    gbc_textField_1.gridwidth = 11;
    gbc_textField_1.insets = new Insets(0, 0, 5, 5);
    gbc_textField_1.fill = GridBagConstraints.HORIZONTAL;
    gbc_textField_1.gridx = 2;
    gbc_textField_1.gridy = 2;
    contentPanel.add(textFieldTitle, gbc_textField_1);
    textFieldTitle.setColumns(10);

    final JCheckBox chckbxCallsFor = new JCheckBox("Calls for");
    GridBagConstraints gbc_chckbxCallsFor = new GridBagConstraints();
    gbc_chckbxCallsFor.anchor = GridBagConstraints.WEST;
    gbc_chckbxCallsFor.insets = new Insets(0, 0, 5, 5);
    gbc_chckbxCallsFor.gridx = 0;
    gbc_chckbxCallsFor.gridy = 3;
    contentPanel.add(chckbxCallsFor, gbc_chckbxCallsFor);

    textFieldCallsFor = new JTextField();
    GridBagConstraints gbc_textField_2 = new GridBagConstraints();
    gbc_textField_2.gridwidth = 11;
    gbc_textField_2.insets = new Insets(0, 0, 5, 5);
    gbc_textField_2.fill = GridBagConstraints.HORIZONTAL;
    gbc_textField_2.gridx = 2;
    gbc_textField_2.gridy = 3;
    contentPanel.add(textFieldCallsFor, gbc_textField_2);
    textFieldCallsFor.setColumns(10);

    final JCheckBox chckbxContains = new JCheckBox("Contains ");
    GridBagConstraints gbc_chckbxContains = new GridBagConstraints();
    gbc_chckbxContains.insets = new Insets(0, 0, 5, 5);
    gbc_chckbxContains.gridx = 0;
    gbc_chckbxContains.gridy = 4;
    contentPanel.add(chckbxContains, gbc_chckbxContains);

    textFieldContains = new JTextField();
    GridBagConstraints gbc_textField_3 = new GridBagConstraints();
    gbc_textField_3.gridwidth = 11;
    gbc_textField_3.insets = new Insets(0, 0, 5, 5);
    gbc_textField_3.fill = GridBagConstraints.HORIZONTAL;
    gbc_textField_3.gridx = 2;
    gbc_textField_3.gridy = 4;
    contentPanel.add(textFieldContains, gbc_textField_3);
    textFieldContains.setColumns(10);

    JButton btnNewButton = new JButton("Search");
    btnNewButton.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            // TODO when search button is clicked
            query = "SELECT * FROM `temp`.`KB_Recipies`";

            // add WHERE if needed
            if (chckbxGuid.isSelected() || chckbxTitle.isSelected()
                    || chckbxCallsFor.isSelected()
                    || chckbxContains.isSelected())
            {
                query += " WHERE ";
            }
            // --------------------

            if (chckbxGuid.isSelected())
            {
                query += "fpItemGUID=" + textFieldGUID.getText();

                // add AND if needed
                if (chckbxTitle.isSelected() || chckbxCallsFor.isSelected()
                        || chckbxContains.isSelected())
                {
                    query += " AND ";
                }
            }

            if (chckbxTitle.isSelected())
            {
                query += "recipeTitle=" + textFieldTitle.getText();

                // add AND if needed
                if (chckbxCallsFor.isSelected()
                        || chckbxContains.isSelected())
                {
                    query += " AND ";
                }
            }
            // if (chckbxCallsFor.isSelected())
            // {
            // query += "fpItemGUID=" + textFieldGUID.getText();
            // // add AND if needed
            // if (chckbxContains.isSelected())
            // {
            // query += " AND ";
            // }
            // }
            // if (chckbxContains.isSelected())
            // {
            // query += "fpItemGUID=" + textFieldGUID.getText();
            // }
            query += ";";

            state = OK_STATE;

            dispose();
        }

    });

    GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
    gbc_btnNewButton.insets = new Insets(0, 0, 5, 5);
    gbc_btnNewButton.gridwidth = 14;
    gbc_btnNewButton.gridx = 0;
    gbc_btnNewButton.gridy = 6;
    contentPanel.add(btnNewButton, gbc_btnNewButton);
}

public boolean isBoxSelected()
{
    return true;
}

public String getQuery()
{
    return this.query;
}

public int showSearchDialog()
{
    // Other setup...
    setVisible(true);
    return state;
}

}

您的对话框需要提供某种getter,调用方可以调用该getter以恢复状态

public class JDialogSearch ... {
    public static final int OK_STATE = 0;
    public static final int CANCEL_STATE = 1;
    // Cause it's really nice to know what the use did
    // ie canceled, okay'ed, didn't find results, what ever...
    private int state = CANCEL_STATE;
    private String searchResult;

    //....///

    OK.addActionListener( new ActionListener() {

        private class OKListener implements ActionListener 
        {
            public void actionPerformed(ActionEvent e) {
                searchResult = someSearchField.getText(); // Or what ever you need
                state = OK_STATE;
                dispose(); // close window
            }
        }
    });

    //...//

    public int showSearchDialog() {
        // Other setup...
        setVisible(true);
        return state;
    }

    public String getSearchResult() {
        return searchResult;
    }
然后在调用代码中调用showSearchDialog,如果用户单击Ok,则获取搜索结果

JDialogSeach dialog = new JDialogSeach(); // seach box implementation of JDialog
switch (dialog.showSearchDialog()) {
    case JDialogSeach.OK_STATE:
        mySearchResult = dialog.getSearchResult();
        break;
}
dialog.setVisible(true);
当然,您可以简单地使用JOptionPane,但这取决于您的需求

查看更多详细信息

更新

为了使应用程序在对话框可见时停止执行,您需要使对话框成为模态


在对话框构造函数中,您应该调用setModaltrue,这在上一节末尾提供的链接中有详细讨论

为了更快地获得帮助,请发布一个。但是通常,不要扩展JDialog或JFrame,只使用它们的一个实例。在这种情况下,您可以将文本字段等放在主代码中,并在t之后检查它们对话框被取消。或者在这种情况下,也许一个JOptionPane就可以了。当我看到SSCCE时,我会知道更多。对不起,我的CAP,我并不是想传达一个强调要点的叫喊。但是@AndrewThompson我用一个几乎满的类更新了我的问题,因为由于GUI和网格布局代码,整个类非常庞大。所有相关的代码都在那里e、 请看一看,我也稍微更新了我的问题。谢谢!一个“几乎满”的类不是SSCCE。请仔细阅读文档,了解发布原因。好的,现在用完整的代码编辑。很抱歉。您没有阅读或不理解SSCCE文档的完整代码!SSCCE是一个源代码ile..太好了,谢谢你的帮助。这让我更近了一步,但现在调用setVisibletrue时我的代码没有停止。我完全重新编辑了我的原始帖子。你能用我更新的问题看一下吗?再次感谢!就是这样!谢谢!我是GUI新手,没有意识到必须调用它。
public class JDialogSearch ... {
    public static final int OK_STATE = 0;
    public static final int CANCEL_STATE = 1;
    // Cause it's really nice to know what the use did
    // ie canceled, okay'ed, didn't find results, what ever...
    private int state = CANCEL_STATE;
    private String searchResult;

    //....///

    OK.addActionListener( new ActionListener() {

        private class OKListener implements ActionListener 
        {
            public void actionPerformed(ActionEvent e) {
                searchResult = someSearchField.getText(); // Or what ever you need
                state = OK_STATE;
                dispose(); // close window
            }
        }
    });

    //...//

    public int showSearchDialog() {
        // Other setup...
        setVisible(true);
        return state;
    }

    public String getSearchResult() {
        return searchResult;
    }
JDialogSeach dialog = new JDialogSeach(); // seach box implementation of JDialog
switch (dialog.showSearchDialog()) {
    case JDialogSeach.OK_STATE:
        mySearchResult = dialog.getSearchResult();
        break;
}
dialog.setVisible(true);