老实说,我只是学习Java上的GUI,目前仅学习AWT,还没有SWING。我似乎还不太了解如何使用侦听器或容器,并且在按X按钮时设法关闭了主程序框架窗口,但是我的弹出对话框错误消息却无法实现。这是我的代码:
import java.awt.*;
import java.awt.Dialog.*;
import java.awt.event.*;
@SuppressWarnings("serial")
public class AWTAccum extends Frame implements KeyListener {
private Label lbl1;
private Label lbl2;
private TextField tf1;
private TextField tf2;
private int sum = 0;
private Dialog pop;
public AWTAccum() {
setTitle("AWT Accumulator");
setSize(300, 150);
setLayout(new FlowLayout());
setResizable(true);
setVisible(true);
lbl1 = new Label("Enter an integer");
lbl2 = new Label("Accumulated sum is");
tf1 = new TextField("", 10);
tf2 = new TextField("0", 10);
tf1.setEditable(true);
tf2.setEditable(false);
add(lbl1);
add(tf1);
add(lbl2);
add(tf2);
tf1.addKeyListener(this);
pop = new Dialog(this, "Error", ModalityType.APPLICATION_MODAL);
Label msg = new Label("You can enter integers only.");
pop.setSize(200, 100);
pop.setVisible(false);
pop.setLayout(new FlowLayout());
pop.add(msg);
pop.setResizable(false);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent w) {
if (w.getWindow().equals(this)) {
dispose();
System.exit(1);
} else if (w.getWindow().equals(pop)) {
pop.dispose();
}
}
});
}
public static void main(String[] args) {
new AWTAccum();
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
try {
sum = sum + Integer.parseInt(tf1.getText());
tf1.setText("");
tf2.setText(Integer.toString(sum));
} catch (Exception ex) {
pop.setVisible(true);
}
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
非常感谢您的帮助。另外,如果有人愿意,请向我解释为什么对话框需要所有者框架,而对话框又必须是主类框架,或者如果我创建另一个框架类,那会不会像另一个内部的窗口一样?对话框让我很困惑,因为我认为我只能创建它的一个实例,但是除非在框架类型类中创建它,否则它会向我显示错误。我认为它本身就是一个顶级容器。
我通常使用秋千,所以我可能是错的。但是我认为您需要将弹出窗口设置为可聚焦的,然后向该弹出窗口添加一个关键侦听器。
pop.setFocusable(true);
this.addKeyListener(pop);
另外,您应该真正学习秋千而不是awt,awt确实已经过时。
import java.awt.*;
import java.awt.Dialog.*;
import java.awt.event.*;
@SuppressWarnings("serial")
public class AWTAccum extends Frame implements KeyListener {
private Label lbl1;
private Label lbl2;
private TextField tf1;
private TextField tf2;
private int sum = 0;
private Dialog pop;
public AWTAccum() {
setTitle("AWT Accumulator");
setSize(300, 150);
setLayout(new FlowLayout());
setResizable(true);
setVisible(true);
lbl1 = new Label("Enter an integer");
lbl2 = new Label("Accumulated sum is");
tf1 = new TextField("", 10);
tf2 = new TextField("0", 10);
tf1.setEditable(true);
tf2.setEditable(false);
add(lbl1);
add(tf1);
add(lbl2);
add(tf2);
tf1.addKeyListener(this);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent w) {
dispose();
System.exit(1);
}
});
pop = new Dialog(this, "Error", ModalityType.APPLICATION_MODAL);
Label msg = new Label("You can enter integers only.");
pop.setSize(200, 100);
pop.setVisible(false);
pop.setLayout(new FlowLayout());
pop.add(msg);
pop.setResizable(false);
//pop.setFocusable(true);
pop.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent w) {
pop.dispose();
}
});
}
public static void main(String[] args) {
new AWTAccum();
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
try {
sum = sum + Integer.parseInt(tf1.getText());
tf1.setText("");
tf2.setText(Integer.toString(sum));
} catch (Exception ex) {
pop.setVisible(true);
}
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}