我正在尝试在用户输入无效输入时显示消息对话框。
当我尝试使用null
作为对话框的位置时,如果输入0或负数,则对话框会正确显示,但对话框中没有标题或文字。
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// draw lines
endY = getHeight(); // bottom
endX = getWidth(); // right side
Input = Integer.parseInt(inputField.getText());
if (Input > 0 ) {
for (int beginY = getHeight() / 2; beginY <= endY; beginY += Input) {
g.drawLine(0, beginY, endX, beginY);
}
} else {
JOptionPane.showMessageDialog(null, "Please do not enter 0 or a negative number.", "Wrong input", JOptionPane.ERROR_MESSAGE);
}
}
我尝试使用已在另一个类中声明和初始化的JFrame
对象作为第一个参数,这是有效的。
但是,我希望能够在JPanel
方法的paintComponent
类中使用此代码,这样我就可以在绘制线条时为其添加if / else逻辑。
答案 0 :(得分:0)
每当AWT EDT(抽象窗口工具包事件调度线程)中的某些内容时,都会调用paintComponent方法 认为该组件需要重新绘制。那个方法是 经常打电话,经常在你没想到的时候打电话。 因此,不要在该方法的主体中显示JOptionPane。你必须 从该方法中取出该逻辑并在需要时显示它。
你可以做这样的事情,但这不是一个好的编程实践:
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (canPaint) {
// Do some painting if we can
// Lets say an error occurred:
// If the dialog is shown over the component then the component will
// be redrawn. Now, we don't want this code to loop, so we set a
// flag to control the "loop".
canPaint = false;
// Now we tell the AWT event queue that we want to show the message
// whenever it get's a chance, because the Dialog won't be drawn
// properly if it's called here.
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
showWarning();
}
});
}
}
void showWarning() {
javax.swing.JOptionPane.showMessageDialog(null, "Syntax Error : ", "Incorrect user input", javax.swing.JOptionPane.ERROR_MESSAGE);
}
但一般情况下,不要在paintComponent方法中执行编程逻辑!
有关详细信息,请参阅此帖子:http://www.java-forums.org/new-java/26110-joptionpane-when-called-inside-paintcomponent-method.html