Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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 如何将GUI的控制传递给其他类_Java_Multithreading_Swing - Fatal编程技术网

Java 如何将GUI的控制传递给其他类

Java 如何将GUI的控制传递给其他类,java,multithreading,swing,Java,Multithreading,Swing,我从来没有做过多线程(我认为这是我需要的,但我不确定),也不知道如何做,我认为在这个问题结束时,这一点会很明显 我用Java制作了一个带有JButtons之类的GUI,当用户单击某个特定按钮时,我想将GUI的控制权传递给另一个类,以便第二个类可以更改/更新GUI。然后,在用户单击另一个按钮(由第二类放在GUI上)后,它将把GUI的控制权返回给第一类 这是我尝试过的,但它的行为不正确: import java.awt.BorderLayout; import java.awt.event.Acti

我从来没有做过多线程(我认为这是我需要的,但我不确定),也不知道如何做,我认为在这个问题结束时,这一点会很明显

我用Java制作了一个带有JButtons之类的GUI,当用户单击某个特定按钮时,我想将GUI的控制权传递给另一个类,以便第二个类可以更改/更新GUI。然后,在用户单击另一个按钮(由第二类放在GUI上)后,它将把GUI的控制权返回给第一类

这是我尝试过的,但它的行为不正确:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;


public class Addition implements ActionListener
{
public JFrame window;
public JPanel windowContents;
public JTextArea windowDialog;
public JButton[] buttons;
public int i = 1;

public Subtraction subtract;

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

Addition ()
{
    window = new JFrame();
    windowContents = new JPanel();
    windowDialog = new JTextArea();
    buttons = new JButton[2];
    buttons[0] = new JButton();
    buttons[1] = new JButton();
    subtract = new Subtraction();

    window.setSize(300, 300);
    windowDialog.setText("Click on a button below. The current value is " + i);
    buttons[0].setText("Click me to add 1");
    buttons[1].setText("Click me to change control");
    buttons[0].addActionListener(this);
    buttons[1].addActionListener(this);

    windowContents.add(windowDialog);
    windowContents.add(buttons[0]);
    windowContents.add(buttons[1]);

    window.add(windowContents);
    window.setVisible(true);
}

public void updateGUI()
{
    windowDialog.setText("Click on a button below. The current value is " + i);
    windowDialog.revalidate();
    windowDialog.repaint();
}

public void actionPerformed(ActionEvent e)

{
    if(e.getSource() == buttons[0])
    {
        i = i + 1;
        updateGUI();
    }
    else if(e.getSource() == buttons[1])
    {
        subtract.getGUI(window, windowContents, buttons, windowDialog, i);
        subtract.takeControl();

        while(subtract.done == false)
        {
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e1)
            {
                e1.printStackTrace();
            }
        }

        System.out.println("Final int = " + i);
    }
}

}
二等舱:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;


public class Subtraction implements ActionListener
{
public JFrame window;
public JPanel windowContents;
public JTextArea windowDialog;
public JButton[] buttons;
public int i;
public boolean done;

public void getGUI(JFrame window, JPanel windowContents, JButton[] buttons, JTextArea windowDialog, int i)
{
    this.window = window;
    this.windowContents = windowContents;
    this.windowDialog = windowDialog;
    this.buttons = buttons;
    this.i = i;
}

public void takeControl()
{
    done = false;
    buttons[0].setText("Click me to subtract 1");
    buttons[1].setText("Click me to change control back to addition");
    updateGUI();
}

public void updateGUI()
{
    windowDialog.setText("Click on a button below. The current value is " + i);
    windowDialog.revalidate();
    windowDialog.repaint();
}

public void actionPerformed(ActionEvent e)
{
    if(e.getSource() == buttons[0])
    {
        i = i - 1;
        updateGUI();
    }
    else if(e.getSource() == buttons[2])
    {
        done = true;
    }
}
}
当我运行此命令时,GUI在线路上冻结

if(e.getSource == buttons[1]) //From the Addition Class
因此,当我从另一个类调用updateGUI()时,我从未得到更新过的GUI

注意:我从我的第一个类复制了UpdateGUI()方法,它在那里工作得非常好,所以我知道该方法可以工作。只是屏幕实际上没有改变

注2:我知道这段代码可以通过一个名为“Math”或类似的类来完成,但这不是我的实际项目。我的实际项目超过1000行,GUI需要由两个类处理。为了不给读者带来1000多行代码的负担,我制作了一个简单的程序,其行为与此相同,只是为了说明发生了什么以及问题是什么


提前谢谢你

看看“SwingWorker”。将“doStuff”方法实现为“doInBackground()”方法。你真的应该摆脱那个while循环!不要在EDT中执行
while(OtherClass.done==false)
对于初学者,“我创建了一个更简化的版本,用于提问。”为了更快地获得更好的帮助,请发布一个(最小完整的可验证示例)或(简短、自包含、正确的示例)。