猿问

无法使用书中的 java AWT 示例添加复选框组

我正在尝试学习一些基本的 AWT 用法来使用复选框组创建一个非常简单的 UI。我一直在使用 Java The Complete Reference - Tenth edition 这本书” 我使用的示例直接来自书中。框架显示,文本字符串也显示,但未显示复选框组(我正在使用Windows 7 64 位上的 eclipse。Java 版本是 12.0.1)


我已经在 eclipse 和命令行中尝试过,结果相同。


下面是示例的源代码:


// Demonstrate AWT Checkbox Group

import java.awt.*;

import java.awt.event.*;


public class CBGroup extends Frame implements ItemListener {

    String msg = "";

    Checkbox windows, android, solaris, mac;

    CheckboxGroup cbg;


    public CBGroup()    {

        // Use a flow layout

        setLayout (new FlowLayout());


        // Create a checkbox group

        cbg = new CheckboxGroup();


        // Create the checkboxes and include them in the group

        windows = new Checkbox("windows", cbg, true);

        android = new Checkbox("android", cbg, false);

        solaris = new Checkbox("solaris", cbg, false);

        mac = new Checkbox("mac", cbg, false);


        // Add item listeners

        windows.addItemListener(this);

        android.addItemListener(this);

        solaris.addItemListener(this);

        mac.addItemListener(this);


        addWindowListener(new WindowAdapter () {

            public void windowClosing (WindowEvent we) {

                System.exit(0); 

            }

        });

    }


    public void itemStateChanged (ItemEvent ie) {

        repaint();

    }


    // Display current state of the check boxes

    public void paint (Graphics g)  {

        msg = "Current selection: ";

        msg += cbg.getSelectedCheckbox().getLabel();

        g.drawString(msg, 20, 120);

    }


    public static void main(String[] args) {

        CBGroup appwin = new CBGroup();


        appwin.setSize(new Dimension (240, 180));

        appwin.setTitle("CBGroup");

        appwin.setVisible(true);

    }

}

我希望显示一个窗口框架,其中包含一个复选框组,显示窗口、solaris、mac 和 android 有选择,并且窗口已经被选为默认窗口。在它下面应该是一个文本字符串,上面写着“当前选择:windows”。文本字符串出现,窗口框架看起来不错并且工作正常,但复选框组没有出现。同样,这段代码直接来自我提到的那本书。我猜它可能与流程布局部分有关,但对此控制不多。


胡子哥哥
浏览 121回答 1
1回答

犯罪嫌疑人X

(在你继续你的项目之前,先看看Swing 和 AWT 有什么区别。我建议你转向 Swing。)您看不到复选框,因为您没有将它们添加到框架中。使用Frame.add(Component c)方法来实现这一点。现在关于自定义绘画,我不喜欢这里,因为它只是一个文本。您可以添加标签或其他东西,而不是使用自定义绘画。此外,当您重写paint方法时,始终从调用开始super.paint(Graphics g)(相同的“规则”适用于 Swing -paintComponent方法)。最后,所有 AWT(和 Swing)应用程序都必须在它们自己的线程上运行。将EventQueue#invokeLater方法用于 AWT 和SwingUtilities#invokeLaterSwing。(他们真的不同吗?)您的代码以及我提到的所有实现:public class CBGroup extends Frame implements ItemListener {    String msg = "";    Checkbox windows, android, solaris, mac;    CheckboxGroup cbg;    public CBGroup() {        super("");        // Use a flow layout        setLayout(new FlowLayout());        // Create a checkbox group        cbg = new CheckboxGroup();        // Create the checkboxes and include them in the group        windows = new Checkbox("windows", cbg, true);        android = new Checkbox("android", cbg, false);        solaris = new Checkbox("solaris", cbg, false);        mac = new Checkbox("mac", cbg, false);        add(windows);        add(android);        add(solaris);        add(mac);        // Add item listeners        windows.addItemListener(this);        android.addItemListener(this);        solaris.addItemListener(this);        mac.addItemListener(this);        addWindowListener(new WindowAdapter() {            @Override            public void windowClosing(WindowEvent we) {                System.exit(0);            }        });    }    @Override    public void itemStateChanged(ItemEvent ie) {        repaint();    }//  // Display current state of the check boxes    @Override    public void paint(Graphics g) {        super.paint(g);        msg = "Current selection: ";        msg += cbg.getSelectedCheckbox().getLabel();        g.drawString(msg, 20, 120);    }    public static void main(String[] args) {        EventQueue.invokeLater(() -> {            CBGroup appwin = new CBGroup();            appwin.setSize(new Dimension(240, 180));            appwin.setTitle("CBGroup");            appwin.setVisible(true);        });    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答