我试着通过一本书来学习一些基本的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”以尝试对代码进行故障排除)。
我不知道为什么会这样。在线研究时我找不到相关的东西。先感谢您。
paintComponent由Swing的绘制体系结构调用,而体系结构在很大程度上依赖于本机系统。 paintComponent可以每秒调用几次,具体取决于具体情况;当窗户移动或移到前面时,可以调用一次或几次。鼠标在其上的每次移动都可以调用它。
您无法控制何时调用paintComponent。您必须只绘制该方法。你不能在其中调用JOptionPane。您不得更改任何状态,也不得更改该方法中的组件或任何其他组件。
如果你想调用JOptionPane,在别处做,然后调用repaint()来请求Swing系统最终调用你的paintComponent方法。
您可以在https://docs.oracle.com/javase/tutorial/uiswing/painting/了解更多信息。