【发布时间】:2012-09-13 19:29:01
【问题描述】:
我遇到了一个问题,我不知道如何解决它。我现在正在阅读(JAVA 如何编程第 9 版)。我的应用程序(第 9 章,第 390 页)需要创建随机数量的具有不同颜色的不同形状,然后布局(JFrame)包含一个 JPanel - 具有形状 - 和一个 JLabel - 具有这些不同形状的数量。 我用随机颜色创建了随机形状,但形状的数量无法正确传递给 main 方法。它总是显示 0。
RandomShapes.java
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;
public class RandomShapes extends JPanel{
public int counter;
private Random random = new Random();
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
drawLines(g);
}
public void drawLines(Graphics g){
for(int i = 0 ; i < random.nextInt(20) ; i++){
g.setColor(generateColor());
g.drawLine(random.nextInt(getWidth()), random.nextInt(getHeight()), random.nextInt(getWidth()), random.nextInt(getHeight()));
counter++;
}
}
private Color generateColor(){
Color color = new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
return color;
}
@Override
public String toString(){
return String.format("%d",counter);
}
}
RandomShapesTest.java
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class RandomShapesTest{
public static void main(String[] args){
RandomShapes shapes = new RandomShapes();
JFrame application = new JFrame();
JLabel status = new JLabel(shapes.toString());
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.add(shapes);
application.setSize(600,600);
application.add(status, BorderLayout.NORTH);
application.setVisible(true);
}
}
顺便说一句,一个小技巧可能比完整的答案更有帮助:)
问候,,,
【问题讨论】:
-
你的意思是“计数器”总是 0 吗?对不起,我不明白你的问题。 “无法正确传递给主要方法”是什么意思。但是计数器似乎没有在正确的位置创建。
-
,考虑在类构造函数中创建计数,而不是在其绘制组件方法中。
-
计数器变量计算已创建的随机形状(在我的示例中为行)的数量,然后我想在 JLabel 中查看这个数字。
-
:您的问题是仅在绘制组件时才调用绘制组件,而不是在构造组件时调用。在类构建时,您的计数变量为 0。
-
Counter 是你的油漆本地的,你应该像 Hovercraft (+1) 所说的那样在你的类构造函数中创建它。顺便说一句,访问局部变量绝不能作为“公共”引用,而是使用 getter 和 setter。也就是说,对于这个问题,气垫船给出了答案。
标签: java swing jpanel paintcomponent