我正在开发一个非常复杂的多层swing gui,现在遇到的主要问题是让jbutton actionlistener在一个单独的jframe上执行setvisible(),并立即对当前jframe执行dispose()。因为我的代码很长,所以将main、jframes和actionlistener都拆分为单独的类文件是很重要的。我写了一个非常简化的问题,分为4个小类文件。它们在这里:
文件1:
import javax.swing.*;
public class Test {
public static void main(String[] args) {
JFrame g1 = new GUI1();
g1.pack();
g1.setLocation(200,200);
g1.setVisible(true);
JFrame g2 = new GUI2();
g2.pack();
g2.setLocation(400,200);
g2.setVisible(false);
}
}
文件2:
import javax.swing.*;
public class GUI1 extends JFrame {
JPanel panel;
JButton button;
public GUI1() {
super("GUI1");
setDefaultCloseOperation(EXIT_ON_CLOSE);
panel = new JPanel();
button = new JButton("Create GUI2");
button.addActionListener(new Listener());
add(panel);
add(button);
}
}
文件3:
import javax.swing.*;
public class GUI2 extends JFrame {
JPanel panel;
JLabel label;
public GUI2() {
super("GUI2");
setDefaultCloseOperation(EXIT_ON_CLOSE);
panel = new JPanel();
label = new JLabel("I'm alive!");
add(panel);
add(label);
}
}
文件4:
import java.awt.event.*;
public class Listener implements ActionListener {
public void actionPerformed(ActionEvent e) {
GUI2.setVisible(true);
GUI1.dispose();
}
}
如您所见,actionlistener的唯一功能是将gui2设置为visible并释放gui1,但它运行错误“不能从静态上下文引用非静态方法(setvisible(boolean)和dispose())”。我认为这是因为这两个方法都试图引用main中创建的对象,而main是静态的。我的困惑是如何绕过这个问题,而不是把所有的东西都合并到一个类中。
有什么建议吗?谢谢!
编辑:以上代码编译成一个文件。。。尽管它返回完全相同的错误。
import javax.swing.*;
import java.awt.event.*;
public class Test {
public static void main(String[] args) {
JFrame g1 = new GUI1();
g1.pack();
g1.setLocation(200,200);
g1.setVisible(true);
JFrame g2 = new GUI2();
g2.pack();
g2.setLocation(400,200);
g2.setVisible(false);
}
}
class GUI1 extends JFrame {
JPanel panel;
JButton button;
public GUI1() {
super("GUI1");
setDefaultCloseOperation(EXIT_ON_CLOSE);
panel = new JPanel();
button = new JButton("Create GUI2");
button.addActionListener(new Listener());
add(panel);
add(button);
}
}
class GUI2 extends JFrame {
JPanel panel;
JLabel label;
public GUI2() {
super("GUI2");
setDefaultCloseOperation(EXIT_ON_CLOSE);
panel = new JPanel();
label = new JLabel("I'm alive!");
add(panel);
add(label);
}
}
class Listener implements ActionListener {
public void actionPerformed(ActionEvent e) {
GUI2.setVisible(true);
GUI1.dispose();
}
}
1条答案
按热度按时间kd3sttzy1#
必须将frame1和frame2的示例传递给
ActionListener
.这意味着您必须将frame2的示例传递给
GUI1
班级。这意味着您必须以相反的顺序创建帧。