gpt4 book ai didi

java - 从另一个类的事件运行新的 GUI 窗口

转载 作者:行者123 更新时间:2023-11-29 03:13:22 24 4
gpt4 key购买 nike

我有 2 个类(class)。两者都实现可运行以创建 GUI。第一个是主要的,第二个是次要的。

我想在主类的 actionlistener 中启动辅助类。

这是代码(这两个类是分开的文件):

public class Main implements Runnable
{
private JTextField txt1, txt2;
private JLabel lbl1, lbl2;

public void run()
{
JFrame frame = new JFrame("Secondary");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Container pane = frame.getContentPane();

JPanel background = new JPanel();
background.setLayout(new BoxLayout(background, BoxLayout.LINE_AXIS));

.........

// Horizontally adding the textbox and button in a Box
Box box = new Box(BoxLayout.Y_AXIS);
......

background.add(box);
pane.add(background);

frame.pack();
frame.setVisible(true);
}

private class SListener implements ActionListener
{
public void actionPerformed(ActionEvent a)
{
Secondary s = new Secondary();
}
}

public static void main (String[] args)
{
Main gui = new Main();
SwingUtilities.invokeLater(gui);
}

}


public class Secondary implements Runnable
{
private JTextField txt1, txt2;
private JLabel lbl1, lbl2;

public Secondary()
{
Secondary gui = new Secondary();
SwingUtilities.invokeLater(gui);
}

public void run()
{
JFrame frame = new JFrame("Secondary");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Container pane = frame.getContentPane();

JPanel background = new JPanel();
background.setLayout(new BoxLayout(background, BoxLayout.LINE_AXIS));

.........

// Horizontally adding the textbox and button in a Box
Box box = new Box(BoxLayout.Y_AXIS);
......

background.add(box);
pane.add(background);

frame.pack();
frame.setVisible(true);
}
}

我想将代码保存在两个文件中,我不想将两个类混合在一个文件中。正如您从代码中看到的那样,在 Secondary 类的构造函数中,我创建了 Secondary 类的实例并运行 gui,以便在 Main 类中创建此类的实例时运行 gui。

不幸的是,这种技术不起作用。

有什么想法吗?谢谢

最佳答案

下面这行是完全错误的:

public Secondary(){
Secondary gui = new Secondary();
SwingUtilities.invokeLater(gui);
}

每次你在代码中的某处调用 new Secondary() 时,上面的代码都会被触发,它会依次调用 new Secondary(),一次又一次,又一次……你的程序被阻止了。

您可能想将其替换为

public Secondary(){
SwingUtilities.invokeLater(this);
}

这将避免循环,但这对于构造函数来说是一种奇怪的行为。

切换到空构造函数(或将其全部删除)更有意义

public Secondary(){
}

并重写你的监听器

public void actionPerformed(ActionEvent a){
Secondary s = new Secondary();
SwingUtilities.invokeLater( s );
}

关于java - 从另一个类的事件运行新的 GUI 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28011212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com