java—有没有一种方法可以从单独的类文件中的actionlistener引用setvisible()和dispose()?

x3naxklr  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(327)

我正在开发一个非常复杂的多层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();

   }
}
kd3sttzy

kd3sttzy1#

必须将frame1和frame2的示例传递给 ActionListener .

import java.awt.event.*;

public class Listener implements ActionListener {

   private JFrame frame1, frame2;

   public Listener(JFrame frame1, JFrame frame2) {
       this.frame1 = frame1;
       this.frame2 = frame2;
   }

   public void actionPerformed(ActionEvent e) {
      frame2.setVisible(true);
      frame1.dispose();
   }

}

这意味着您必须将frame2的示例传递给 GUI1 班级。

import javax.swing.*;

public class GUI1 extends JFrame {

   JPanel panel;
   JButton button;

   public GUI1(JFrame frame2) {

      super("GUI1");
      setDefaultCloseOperation(EXIT_ON_CLOSE);

      panel = new JPanel();
      button = new JButton("Create GUI2");
      button.addActionListener(new Listener(this, frame2));

      add(panel);
      add(button);
   }

}

这意味着您必须以相反的顺序创建帧。

import javax.swing.*;

public class Test {

   public static void main(String[] args) {

      JFrame g2 = new GUI2();
      g2.pack();
      g2.setLocation(400,200);
      g2.setVisible(false);

      JFrame g1 = new GUI1(g2);
      g1.pack();
      g1.setLocation(200,200);
      g1.setVisible(true);  
   }

}

相关问题