为什么在调用paintComponent方法时,JOptionPane中没有显示文本?

时间:2014-08-11 18:39:55

标签: java swing dialog

我正在尝试在用户输入无效输入时显示消息对话框。

当我尝试使用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逻辑。

1 个答案:

答案 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