gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:35:40 24 4
gpt4 key购买 nike

我正在尝试学习一些基本的 AWT 用法,以创建一个带有复选框组的非常简单的 UI。我一直在使用《Java 完整引用 - 第十版》一书。我使用的示例直接来自书中。框架显示,文本字符串也显示,但复选框组没有显示(我正在使用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);
}
}

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

最佳答案

(在继续您的项目之前,请查看 what is the difference between Swing and AWT我建议您迁移到 Swing。)

您无法看到复选框,因为您没有将它们添加到框架中。使用 Frame.add(Component c) 方法来实现这一点。

现在关于自定义绘画,我不喜欢在这里,因为它只是一个文本。您可以添加标签或其他东西,而不是使用自定义绘画。另外,当您重写 paint 方法时,始终首先调用 super.paint(Graphics g) (相同的“规则”适用于 Swing - paintComponent) > 方法)。

最后,所有 AWT(和 Swing)应用程序都必须在自己的线程上运行。对于 AWT 使用 EventQueue#invokeLater 方法,对于 Swing 使用 SwingUtilities#invokeLater 方法。 (它们实际上有不同吗?)

您的代码以及我提到的所有实现:

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);
});
}
}

关于java - 无法使用书中的 java AWT 示例添加复选框组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57540831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com