为什么调用JOptionPane.showInputDialog比它应该更多,为什么以及如何防止它

问题描述 投票:1回答:1

我试着通过一本书来学习一些基本的java,其中一个练习要求我根据用户输入显示一组条形图形。

我必须查询用户输入否。要显示的条形图和每条条纹的长度。

我使用以下内容:

1`st是我定义的Bar类,用于绘制与输入的数字相对应的矩形

import java.awt.Graphics;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Bar extends JPanel
{
    private int noOfBars; // number of bars to display
    int i = 0;

// constructor with choice input
public Bar (int noOfBars)
{
    this.noOfBars = noOfBars;
}

// draw desired shapes starting from default position (0, 5) and incrementing for each new bar

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);


        do
        {
            String input = JOptionPane.showInputDialog("Enter number: ");
            int length = Integer.parseInt(input);

            for (int j = 1; j <= length; j++)
            g.drawRect(0, 5 + i * 20 ,j * 15 , 15);
            i++;

        }   while (i < noOfBars);

    }

}

2`是主要类:

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class ShapesExercise
{

    public static void main(String[] args)
    {
    int noOfBars = 0;
    // obtain user choice



    String input = JOptionPane.showInputDialog("Enter total bars to display:");
    noOfBars = Integer.parseInt(input);

    if (noOfBars == 0)
        {
            JOptionPane.showMessageDialog(null,"Invalid number.");
            input = JOptionPane.showInputDialog("Enter total bars to display::");
            noOfBars = Integer.parseInt(input);
        }

    JFrame application = new JFrame();
    application.setSize(300, 40 + 25 * noOfBars);
    Bar panel = new Bar(noOfBars);
    application.add(panel);
    application.setVisible(true);
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

我的问题如下:第一个message_dialog(在主类中创建的)正常工作,只弹出一次并查询输入。

但是,即使在“do while”循环结束后,Bar类生成的message_dialogs仍然会弹出(这最初是一个“for”循环,但我将其更改为“do while”以尝试对代码进行故障排除)。

我不知道为什么会这样。在线研究时我找不到相关的东西。先感谢您。

java joptionpane
1个回答
2
投票

paintComponent由Swing的绘制体系结构调用,而体系结构在很大程度上依赖于本机系统。 paintComponent可以每秒调用几次,具体取决于具体情况;当窗户移动或移到前面时,可以调用一次或几次。鼠标在其上的每次移动都可以调用它。

您无法控制何时调用paintComponent。您必须只绘制该方法。你不能在其中调用JOptionPane。您不得更改任何状态,也不得更改该方法中的组件或任何其他组件。

如果你想调用JOptionPane,在别处做,然后调用repaint()来请求Swing系统最终调用你的paintComponent方法。

您可以在https://docs.oracle.com/javase/tutorial/uiswing/painting/了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.