Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java暂停代码并等待用户输入_Java_Multithreading_Jframe_Jpanel - Fatal编程技术网

java暂停代码并等待用户输入

java暂停代码并等待用户输入,java,multithreading,jframe,jpanel,Java,Multithreading,Jframe,Jpanel,我将程序分为两部分编写,首先编写实际功能,然后编写GUI以显示所有功能。 在继续执行代码之前,我需要等待/暂停用户单击另一个类(DisplayImages)中的“完成”按钮。 MyDisplayImages类获取MyImage的列表。然后图像显示在jpanel中,用户选择两个图像 然后单击“完成”按钮。我怎么能等待答复或诸如此类的事情 public class One{ ArrayList<MyImage> images = new ArrayList<MyImage

我将程序分为两部分编写,首先编写实际功能,然后编写GUI以显示所有功能。 在继续执行代码之前,我需要等待/暂停用户单击另一个类(DisplayImages)中的“完成”按钮。 MyDisplayImages类获取MyImage的列表。然后图像显示在jpanel中,用户选择两个图像 然后单击“完成”按钮。我怎么能等待答复或诸如此类的事情

public class One{

    ArrayList<MyImage> images = new ArrayList<MyImage>();

    public One(){
        DisplayImages displayOne = new DisplayImages(images);
        displayOne.run();
        //I need to pause/wait here until the user has pressed the done button
        //in the DisplayImages class

        images.clear();
        images = displayOne.getSelectedImages();

        //do stuff here with images arrylist
        }
}    
公共一级{
ArrayList images=新的ArrayList();
公共一号{
DisplayImages displayOne=新的DisplayImages(图像);
displayOne.run();
//我需要在此处暂停/等待,直到用户按下“完成”按钮
//在DisplayImages类中
图像。清除();
images=displayOne.getSelectedImages();
//在这里使用图像arrylist进行操作
}
}    
显示图像类

public class DisplayImages extends JFrame{
    private ArrayList<MyImage> images = new ArrayList<MyImage>();
    private ArrayList<MyImage> selectedImages = new ArrayList<MyImage>();

    public DisplayImages(ArrayList<MyImage> images){
        this.images = images;
    }

    public void run(){
        //code creates a jpanel and displays images along with a done button

        //user presses done button
        done.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                setVisible(false);
                selectedImages = getSelectedImages();
                //here I would send a signal to continue running in class One
            }
        });
    }

    private ArrayList<MyImage> getSelectedImages(){
        //code returns list of all the images the user selected on JPanel
        return results;
    }
}
公共类DisplayImages扩展JFrame{
私有ArrayList图像=新建ArrayList();
private ArrayList selectedImages=new ArrayList();
公共显示图像(ArrayList图像){
这个。图像=图像;
}
公开募捐{
//代码创建一个jpanel并显示图像以及一个“完成”按钮
//用户按下“完成”按钮
done.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
setVisible(假);
selectedImages=getSelectedImages();
//在这里,我会发出一个信号,继续在一班跑步
}
});
}
private ArrayList getSelectedImages(){
//代码返回用户在JPanel上选择的所有图像的列表
返回结果;
}
}

您必须使用线程

然后,您可以在单独的线程上设置每个实例,并使用内置的
Object.notify和Object.wait


或者让您自己拥有一个全局标志变量static,可供两个类使用,您可以将其更改为通知另一个类已单击“完成”按钮。

这很容易,这里的一些人认为这很复杂。您不需要多线程,只需要一个模态对话框。提供对它们的轻松访问

我修改了你的代码:

public class One{

    ArrayList<MyImage> images = new ArrayList<MyImage>();

    public One(){
        DisplayImages displayOne = new DisplayImages(images);
        int n = JOptionPane.showConfirmDialog(null, displayOne);

        if (n == JOptionPane.OK_OPTION){
          //I need to pause/wait here until the user has pressed the done button
          //in the DisplayImages class

          images = displayOne.getSelectedImages();

          //do stuff here with images arrylist
          }
        }
}    
公共一级{
ArrayList images=新的ArrayList();
公共一号{
DisplayImages displayOne=新的DisplayImages(图像);
int n=JOptionPane.showConfirmDialog(null,displayOne);
if(n==JOptionPane.OK\u选项){
//我需要在此处暂停/等待,直到用户按下“完成”按钮
//在DisplayImages类中
images=displayOne.getSelectedImages();
//在这里使用图像arrylist进行操作
}
}
}    
MyImage类

public class DisplayImages extends JPanel{
    private ArrayList<MyImage> images = new ArrayList<MyImage>();

    public DisplayImages(ArrayList<MyImage> images){
        this.images = images;

        //code creates a jpanel and displays images along with a done button
    }

    public ArrayList<MyImage> getSelectedImages(){
        //code returns list of all the images the user selected on JPanel
        return results;
    }
}
公共类DisplayImages扩展了JPanel{
私有ArrayList图像=新建ArrayList();
公共显示图像(ArrayList图像){
这个。图像=图像;
//代码创建一个jpanel并显示图像以及一个“完成”按钮
}
公共阵列列表getSelectedImages(){
//代码返回用户在JPanel上选择的所有图像的列表
返回结果;
}
}

如果出于某种原因,您需要以相同的方法打开和处理对话框,那么使用
JOptionPane
建议的对话框方法似乎可以。然而,这似乎是糟糕的设计(打开一个框架并等待构造函数中的输入?)。我更喜欢类似于下面的方法(请阅读我的内联评论):

公共一级{
ArrayList images=新的ArrayList();
公共一号{
//在此仅执行初始化
}
//调用此方法创建允许用户选择图像的对话框
公共对话框(){
DisplayImages displayOne=新的DisplayImages(图像);
//传递对此对象的引用,以便DisplayImages可以回调它
displayOne.run(这个);
}
//单击“完成”时,DisplayImages的操作侦听器将调用此函数
公共作废处理selectedImages(列出selectedImages){
图像。清除();
图像=选定的图像;
//在这里使用图像arrylist进行操作
}
}
公共类显示图像{
...
public void run(最后一个回调){//注意,现在传递了对调用方的引用
//创建jpanel并显示带有“完成”按钮的图像
//用户按下“完成”按钮
done.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
setVisible(假);
selectedImages=getSelectedImages();
//下面是我们如何发送信号通知来电者
callback.processSelectedImages(selectedImages);
}
});
}
...
}

作为旁注,如果您没有实现
Runnable
接口和/或使用线程,请不要命名方法
run()
。这很让人困惑

+1当然,听众比我的建议要好,但我想让它简单一些。这看起来像是我可能会用到的东西。我可能不得不使用反射,因为public void run(最后一个回调)是硬编码的,只接受一个类型的类,但我需要其他调用run的类。@Miss_poker你可以让所有像
One
这样的类实现一个接口(比如
Caller
),该接口将有一个方法
public void processSelectedImages(列出选定的图像)
。然后
显示图像。run()
将更改为
公共无效运行(最终调用方)
。如果这仍然不够好,请编辑您的问题,以澄清您的问题restrictions@c.s.谢谢!我试试看。
public class One {

    ArrayList<MyImage> images = new ArrayList<MyImage>();

    public One() {
        // perform only initialization here
    }

    // call this method to create the dialog that allows the user to select images
    public void showDialog() {
        DisplayImages displayOne = new DisplayImages(images);

        // pass a reference to this object so DisplayImages can call it back
        displayOne.run(this);
    }

    // this will be called by the action listener of DisplayImages when Done is clicked
    public void processSelectedImages(List<MyImage> selectedImages) {
        images.clear();
        images = selectedImages;

        // do stuff here with images arrylist
    }
}


public class DisplayImages {
    ...
    public void run(final One callback){  // Note that now a reference to the caller is passed
         // creates jpanel and displays images along with a done button

         // user presses done button
         done.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e) {
                 setVisible(false);
                 selectedImages = getSelectedImages();

                 // here is how we can send a signal to notify the caller
                 callback.processSelectedImages(selectedImages); 
             }
         });
    }
    ...
}