0

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

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

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

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

好像我错过了一些简单的东西,但我看不到如何做到这一点。

编辑:

根据 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

4

1 回答 1

5

Java 教程有一个专门讨论这个的部分。我建议检查一下。

将它与获取用户输入部分结合起来,您就得到了您想要的。

编辑

这是一个稍微弄乱教程的例子:

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

}
于 2012-12-20T17:58:26.163 回答