【问题标题】:How to handle close button in AWT Frame如何处理 AWT 框架中的关闭按钮
【发布时间】:2019-07-31 09:35:12
【问题描述】:

我从一些基本的 Java2D 示例开始 - 特别是在 AWT 下 - 遵循“计算机图形学 Java2D/Java3D 简介”一书的第一个示例,我编写了以下两个类,一个作为“主”类:

package com.example.test;

public class Test {

    public static void main( String[] args ) {

            MyChart terminal = new MyChart();
            terminal.setTitle("The first Java 2D program");
            terminal.setSize(350,80);
            terminal.setVisible(true);

    }

}

还有一个扩展 AWT Frame 的:

package com.example.test;

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyChart extends Frame {


        public void MyChart() {

            this.addWindowListener(new WindowAdapter(){  
                public void windowClosing(WindowEvent e) {  
                    dispose();  
                }  
            });

        }

        public void paint(Graphics g) {
            Graphics2D g2d =  (Graphics2D) g;
            g2d.drawString("Hello world!", 30, 50);
        };


}

这会在屏幕上生成预期的“Hello World”窗口,但是当我单击关闭按钮 (Windows 10) 时,什么也没有发生。我试图弄清楚我在添加侦听器时做错了什么,但没有成功。

欢迎任何提示或建议,甚至进一步调试。

如前所述,我使用的是 Java:1.8.0_191 和 Windows 10。

【问题讨论】:

  • "《计算机图形学 Java2D/Java3D 简介》一书的例子 你的意思是this book?它是在 2008 年写的!即使使用 AWT 组件(例如Canvas) 作为游戏渲染表面,我建议将 Swing 组件用于 everything 其他。或者如我的复制/粘贴评论中所见.. 为什么使用 AWT?请参阅 this answer 有很多充分的理由放弃 AWT 组件,转而使用 Swing。

标签: java java-8 awt java-2d


【解决方案1】:

您没有在主类中调用 MyChart 函数。 下面的代码工作正常。

public class Test {

        public static void main( String[] args ) {
            System.out.println("Terminal Group");
            MyChart terminal = new MyChart();
            terminal.MyChart();//I added this.
            terminal.setTitle("The first Java 2D program");
            terminal.setSize(350,80);
            terminal.setVisible(true);
    }

}

public class MyChart extends Frame {
        public void MyChart() {
            this.addWindowListener(new WindowAdapter(){  
                public void windowClosing(WindowEvent e) {  
               dispose();
               }  
            });

        }

        public void paint(Graphics g) {
            Graphics2D g2d =  (Graphics2D) g;
            g2d.drawString("Hello world!", 30, 50);
        };
}

【讨论】:

  • 您不需要调用构造函数,它必须在您从该类实例化对象时执行。问题是构造函数包含 void。
  • 他在名为MYchart 的类中创建了方法,并且在主类中必须调用该关闭方法才能工作,这就是他的代码无法正常工作的原因。你的方法很好,但通过制作方法做同样的事情也很好。
  • 我认为@M.E.的方法更好。 MyChart 显然是一个构造函数。
【解决方案2】:

构造函数定义错误,void 存在且必须删除。

原始代码(错误的构造函数,使用了void):

    public void MyChart() {

        this.addWindowListener(new WindowAdapter(){  
            public void windowClosing(WindowEvent e) {  
                dispose();  
            }  
        });

    }

更正的代码(没有无效):

public MyChart() {

        this.addWindowListener(new WindowAdapter(){  
            public void windowClosing(WindowEvent e) {  
                dispose();  
            }  
        });

}

【讨论】:

  • 哦.. 很好看!即使使用您的示例,我也花了一些时间查看它被删除的位置。但也许可以解释一下 在哪里 void 被删除了,并且它被删除是因为它将构造函数变成了一个方法(不会自动调用)。
  • 我已经修改了答案以反映这一点。居然是在和朋友讨论这个问题时发现的,他正在为为什么没有调用构造函数而发疯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2011-05-30
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多