Java 如何将GUI的控制传递给其他类
我从来没有做过多线程(我认为这是我需要的,但我不确定),也不知道如何做,我认为在这个问题结束时,这一点会很明显 我用Java制作了一个带有JButtons之类的GUI,当用户单击某个特定按钮时,我想将GUI的控制权传递给另一个类,以便第二个类可以更改/更新GUI。然后,在用户单击另一个按钮(由第二类放在GUI上)后,它将把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
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)
对于初学者,“我创建了一个更简化的版本,用于提问。”为了更快地获得更好的帮助,请发布一个(最小完整的可验证示例)或(简短、自包含、正确的示例)。