框架一上的按钮应关闭框架二.ActionListener 引用 JAVA 中另一个类的对象



我在单独的类中有两个框架(FrameOne和FrameTwo(FrameOne有两个按钮。一个用于打开框架二,一个用于关闭框架二。我知道如何打开FrameTwo。但不是如何从第一帧关闭。如何对其进行编码以使其正常工作?谢谢。(我知道也有类似的问题。我把它们都红了。但它没有给我答案。GUI 指南也没有帮助。

public class Main {
public static void main(String[] args) {
FrameOne frame = new FrameOne();
}
}

帧一类:

public class FrameOne extends JFrame implements ActionListener{
private JButton btn1, btn2;
FrameOne () {
setVisible(true);
setSize(400,400);
setLayout(new FlowLayout());
setTitle("Main");
setDefaultCloseOperation(EXIT_ON_CLOSE);
btn1 = new JButton("opens FrameTwo");
btn2 = new JButton("close FrameTwo");
btn1.addActionListener(this);
btn2.addActionListener(this);
add(btn1);
add(btn2);
}
@Override
public void actionPerformed (ActionEvent e) {
if(e.getSource()== btn1) {  
FrameTow frameTwo = new FrameTwo(); 
}
else if(e.getSource()== btn2) ;
// {???.dispose(); }
}
}

'框架 2 类:

public class FrameTow extends JFrame {
FrameTwo () {
setVisible(true);
setSize(400,400);
setTitle("FrameTwo");
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocation(400, 400);
}
}

以下任何解决方案都可以使用

frameTwo.dispatchEvent(new WindowEvent(frameTwo, WindowEvent.WINDOW_CLOSING));

frameTwo.setVisible(false);

简短的回答是修改FrameOne

private JFrame frameTwo; //introduce a field  

@Override
public void actionPerformed (ActionEvent e) {
if(e.getSource()== btn1) {
frameTwo = new FrameTwo();  //use field in action listener 
}
else if(e.getSource()== btn2){
frameTwo.dispose();         //use field in action listener 
}
}

更长的答案:对第 2 帧使用JDialog是一种更好的做法:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
new FrameOne();
}
}
class FrameOne extends JFrame implements ActionListener{
private final JButton btn1, btn2;
private JDialog frameTwo; //introduce a field
FrameOne () {
setSize(400,400);
setLayout(new FlowLayout());
setTitle("Main");
setDefaultCloseOperation(EXIT_ON_CLOSE);
btn1 = new JButton("opens FrameTwo");
btn2 = new JButton("close FrameTwo");
btn1.addActionListener(this);
btn2.addActionListener(this);
add(btn1);
add(btn2);
setVisible(true); //make it visible after construction is completed
}
@Override
public void actionPerformed (ActionEvent e) {
if(e.getSource()== btn1) {
frameTwo = new FrameTwo();  //use field in action listener
}
else if(e.getSource()== btn2){
frameTwo.dispose();         //use field in action listener
}
}
}
class FrameTwo extends JDialog {
FrameTwo() {
setSize(400,400);
setTitle("FrameTwo");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setLocation(400, 400);
setVisible(true); //make it visible after construction is completed
}
}

在您展示的示例中,可以打开多个FrameTwo实例。第二个按钮应该关闭哪一个?

假设您希望只有一个字段,则可以在 FrameOne 中引入一个字段,最初设置为null。 然后,btn1只会在字段null时打开一个框架,并将其分配给该字段。然后btn2可以在字段上调用dispose()(并将其重置为null(。

示例,根据您的尝试:

public class FrameOne extends JFrame implements ActionListener {
private JButton btn1, btn2;
private FrameTwo frameTwo = null;
FrameOne () {
setVisible(true);
setSize(400,400);
setLayout(new FlowLayout());
setTitle("Main");
setDefaultCloseOperation(EXIT_ON_CLOSE);
btn1 = new JButton("opens FrameTwo");
btn2 = new JButton("close FrameTwo");
btn1.addActionListener(this);
btn2.addActionListener(this);
add(btn1);
add(btn2);

}
@Override
public void actionPerformed (ActionEvent e)
{if(e.getSource()== btn1) 
{
if (frameTwo == null) {    
frameTwo = new FrameTwo();
}
}
else if(e.getSource()== btn2) {
frameTwo.dispatchEvent(new WindowEvent(frameTwo, WindowEvent.WINDOW_CLOSING));
frameTwo = null;
}}}

最新更新