无法使用书中的 java AWT 示例添加复选框组
Can't add checkbox group using java AWT example from book
我正在尝试学习一些基本的 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);
}
}
我希望 window 框架显示一个复选框组,该复选框组显示 windows、solaris、mac 和 android 有选择和 windows已经选择为默认值。在它下面应该是一个文本字符串 "Current selection: windows"。文本字符串出现并且 window 框架看起来不错并且工作正常但复选框组没有出现。同样,这段代码直接来自我提到的那本书。我猜它可能与流程布局部分有关,但对此控制不多。
(在你继续你的项目之前,先看看 what is the difference between Swing and AWT。我建议你转到 Swing。)
您看不到复选框,因为您没有将它们添加到框架中。使用 Frame.add(Component c)
方法来实现这一点。
关于自定义绘画,我不喜欢这里,因为它只是一个文本。您可以添加标签或其他东西,而不是使用自定义绘画。此外,当您覆盖 paint
方法时,始终从调用 super.paint(Graphics g)
开始(同样的 "rule" 适用于 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);
});
}
}
我正在尝试学习一些基本的 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);
}
}
我希望 window 框架显示一个复选框组,该复选框组显示 windows、solaris、mac 和 android 有选择和 windows已经选择为默认值。在它下面应该是一个文本字符串 "Current selection: windows"。文本字符串出现并且 window 框架看起来不错并且工作正常但复选框组没有出现。同样,这段代码直接来自我提到的那本书。我猜它可能与流程布局部分有关,但对此控制不多。
(在你继续你的项目之前,先看看 what is the difference between Swing and AWT。我建议你转到 Swing。)
您看不到复选框,因为您没有将它们添加到框架中。使用 Frame.add(Component c)
方法来实现这一点。
关于自定义绘画,我不喜欢这里,因为它只是一个文本。您可以添加标签或其他东西,而不是使用自定义绘画。此外,当您覆盖 paint
方法时,始终从调用 super.paint(Graphics g)
开始(同样的 "rule" 适用于 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);
});
}
}