为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2023-06-08 19:19:05
我正在尝试学习一些基本的 AWT 用法来使用复选框组创建一个非常简单的 UI。我一直在使用 Java The Complete Reference - Tenth edition 这本书” 我使用的示例直接来自书中。框架显示,文本字符串也显示,但未显示复选框组(我正在使用Windows 7 64 位上的 eclipse。Java 版本是 12.0.1)我已经在 eclipse 和命令行中尝试过,结果相同。下面是示例的源代码:// Demonstrate AWT Checkbox Groupimport 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”。文本字符串出现,窗口框架看起来不错并且工作正常,但复选框组没有出现。同样,这段代码直接来自我提到的那本书。我猜它可能与流程布局部分有关,但对此控制不多。
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

(在你继续你的项目之前,先看看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);

        });

    }

}


查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信