从对话中获取价值而不关闭它?

时间:2012-12-20 17:51:10

标签: java swing jdialog

我有一个应用程序,它使用JDialog从用户那里获取输入,然后搜索文件,而不是浏览对话框,而是使用元数据的更专业的文件。

这一切都很好。唯一的问题是我希望能够让用户输入搜索值,按确定,并接收这些值来执行搜索和其他一些操作(来自打开对话框的调用类)而不关闭对话框?< / p>

有必要从调用类中执行这些操作,因为这是编辑器中插件的一部分。

基本上,简而言之,它有点像“查找”对话框在任何编辑器中的工作方式 - 当您从一个找到的项目跳到下一个项目时,查找对话框保持打开状态...

好像我错过了一些简单的东西,但我看不出怎么做。

编辑:

我根据Nick Rippe建议的教程在一个简单的测试应用程序中尝试过这个,但我认为我在某种程度上误解了它,因为我无法让它工作。我添加了一个带有getter和setter的字段,然后尝试获取它:

主要课程:

public class TestJFrames {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        TestForm frame = new TestForm();
        frame.setDefaultCloseOperation(frame.DO_NOTHING_ON_CLOSE);
        frame.addPropertyChangeListener("fileSelected", new FileSelectedListener());
        frame.setVisible(true);
    }
}

class FileSelectedListener implements PropertyChangeListener {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        System.out.println("TEST");
    }
}

从表单类:

  private String fileSelected;
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        this.setFileSelected("Test");
    }

    public String getFileSelected() {
        return fileSelected;
    }

    public void setFileSelected(String fileSelected) {
        this.fileSelected = fileSelected;
    }

我最终找到了另一种解决方案。如果它可以帮助其他有类似困难的人,请在此处发布:

通过将它注册为对话框类的监听器,我可以通过调用类来监听按钮事件。我几乎遵循了这个例子:Create a custom event in Java

1 个答案:

答案 0 :(得分:5)

Java教程有一个section specifically devoted to this。我建议检查一下。

将其与Getting User Input部分相结合,您就可以得到您想要的内容。

修改

以下是一些关于修改教程的例子:

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

public class Temp extends Box{
    JFrame frame;
    JTextArea text;

    public Temp(JFrame frame){
        super(BoxLayout.Y_AXIS);
        this.frame = frame;
        text = new JTextArea("Clickity Clack, down't the track.\nspam");
        add(text);
        JButton button = new JButton("Click Me");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                launchDialog();
            }
        });
        add(button);
    }

    public void launchDialog(){
        //What you want the find button to do
        JButton findButton = new JButton("Find");
        findButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                int start = text.getText().indexOf("spam");
                int end = start + "spam".length();
                if(start != -1){
                    text.requestFocus();
                    text.select(start, end);
                }
            }
        });

        //Cancel button hides the dialog
        JButton cancelButton = new JButton("Cancel");       

        // Create the options displayed in the dialog
        final JOptionPane optionPane = new JOptionPane(
                "Find \"spam\"?\n"
                + "Do you understand?",
                JOptionPane.QUESTION_MESSAGE,
                JOptionPane.YES_NO_OPTION, null, new Object[]{findButton, cancelButton});

        // Build the dialog window
        final JDialog dialog = new JDialog(frame, 
                                     "Click a button",
                                     false);

        //Add action to close button
        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
            }
        });

        //Finish up and make it visible
        dialog.setContentPane(optionPane);
        dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        dialog.setLocation(100, 100);
        dialog.pack();
        dialog.setVisible(true);

    }


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

            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new Temp(frame));
                frame.pack();
                frame.setVisible(true);
            }});
    }

}