基本上,我有一个接口形状,它具有draw()
和animate()
方法。绘制形状的每个类都实现了这一点。还有一个类包含这些形状类的arraylist
。然后有一个单独的类包含我的JFrame。我有一个“动画”按钮,它调用ArrayList
中的所有Animate()
方法。
public class Circle extends Canvas implements Shape{
int xpos, ypos, diam;
GradientPaint color;
public Circle(){
xpos = 103;
ypos = 88;
diam = 140;
color = new GradientPaint(0, 0, new Color(204, 204, 254),
120, 100, new Color(255, 255, 255), true);
}
@Override
public void draw(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(color);
g.fillOval(xpos, ypos, diam, diam);
}
@Override
public void animate(){
xpos += 10;
ypos += 10;
repaint();
}
}
public class ShapeCanvas extends Canvas { private ArrayList list; public ShapeCanvas(){ setBackground(Color.WHITE); setSize(1000, 700); list = new ArrayList<>(); Circle circle = new Circle(); list.add(circle);} //calls all draw() method @Override public void paint(Graphics g){ for (int i = 0; i < list.size(); i++){ list.get(i).draw(g); } } //this method calls all animate() method public void animateAll(){ for (int i = 0; i < list.size(); i++){ list.get(i).animate(); } }
我试过使用
JPanel
或JLayeredPane
,试过使用revalidate()、validate(),甚至invalidate()
。许多人建议使用一个调用super.paintComponent()的paintComponent(),但是有没有什么方法可以在不删除/替换draw()
方法的情况下做到这一点?不过,我可能错过了一些重要的细节。..显然,很多人已经问过这个问题了,我也读过其中的大部分。我很抱歉多此一举。但任何帮助或建议都非常感谢!
编辑:我修好了!谢谢你们,伙计们!
根据我的理解,(这仅限于我上学期上的课)您需要重写paintComponent并调用子组件的draw函数。repaint()调用PaintComponent。
下面是我教授上学期给出的示例代码。我发现他的代码很清晰,很容易从。http://students.cs.byu.edu/~cs240ta/fall2013/rodham_files/week-09/graphics-programming/code/drawing/src/noevents/drawingcomponent.java
对于我的程序,我目前希望使用open按钮打开JFileChooser并选择一个图像,然后在applet左侧的JPanel上绘制它,我知道该文件正在被检索,但当我重新绘制图形上下文时,什么也没有发生。提前谢了。
在试图制作一个非常简单的子弹地狱游戏来学习java时,我遇到了一个障碍: repaint()没有调用油漆组件()。 这是整个程序,目前只需将我每秒创建50次的图像绘制到JFrame上的JPanel上。 在使用断点和println方法进行了一些调试之后,我可以确认正在读取正确的图像,gameTimerAction中的计时器每秒被调用50次,并且repaint()根本没有调用paintComponen
问题内容: 每当我尝试调用repaint()方法时,都会说不能从静态方法引用非静态方法。顺便说一句,它与paintComponent方法在同一类中。我尝试首先在类之外创建一个对象,然后使用对象名称引用它,但是它也没有用。请帮忙。 问题答案: 主要方法是静态的。您的p对象不是:它是P类的实例字段。试试这个: 您应该始终从事件分发线程访问Swing组件,这就是为什么我将它们全部放在EventQueue
我想做一个象棋游戏,我想在游戏循环中的一个jFrame上调用方法。这个特殊的JFrame显示了每个玩家的总击杀数。我很确定确实调用了repaint(),但由于某种原因,它似乎没有正确更新我的jlabel,jlabel应该保存每个玩家的击杀数值。 这是我为自定义JFrame扩展类编写的代码,该类包含代表kill的JLabel。 然后我只是在不同类的main方法中调用这个框架的repaint(): 非
我已经花了几天时间试图让Graphics2D类在我的代码中工作。我把它的结构化为这样一种方式,即当注册了一个单击事件时,调用reaint()就完成了,但是当它到达调用repaint()的阶段时,这只会产生一个空指针异常。 调试时,这一切都在按预期工作,而不是从油漆组件方法中调用,但是当试图使用油漆组件和reaint()正确调用代码以允许Graphics2D类显示每个点的行时,它不起作用。 我已经包
首先,请不要因为创建一个问题而将我置于火刑柱上,而其他具有类似名称和内容的人却存在。我把它们都看了一遍,但没有找到解决办法。 调用repaint()绝对不会调用paintComponent(),不管我似乎尝试了什么。下面是与问题相关的所有代码: 按照预期,“创建的级别面板和设置的内容窗格”被打印到控制台。 从不打印“油漆组件级油漆”。“计时器重新绘制”每2秒打印一次,正如预期的那样。