我正在开发一个使用MVC架构显示动画的程序。该模型包含形状,并告诉它们进行变异。所讨论的视图是扩展JPanel的类。它从控制器接受形状并将其放置在paintComponent
中的Graphics对象上。控制器的run
方法中有一个while循环,它告诉模型改变所有形状,将这些形状推入视图,然后使线程休眠一定时间。
但是,我遇到的问题是:Graphics对象似乎在每个paintComponent
调用中都简单地覆盖了新形状,以便您可以在整个运行过程中看到形状的轨迹该程序。这仅在视图扩展JPanel时才有问题(程序对于先前的实现运行良好,该程序是具有匿名JPanel类的JFrame),并且似乎仅在我的Linux机器上有问题(我的项目合作伙伴使用的是macbook- -标记Linux
,因为它可能与Linux平台相关联)。另外,我已经在Oracle jdk8,open-jdk8和open-jdk10中进行了尝试。
我确定这只是我代码中的错误,因为其他程序可以工作。难道这是Linux jdk找不到但macOS找不到的bug?
我将尽力去做伪代码,以免抄袭dock窃
当前代码:
public class MyVisualView extends JPanel implements MyViews {
// store my shapes with name shapes
public MyVisualView() {
JFrame frame = new JFrame();
frame.setSize(width, height);
frame.setResizable(false);
frame.getContentPane().add(this);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
// tried these individually -- didn't work
this.setOpaque(true);
this.setBackground(Color.WHITE);
}
@Override
public void paintComponent(Graphics g) {
for (all of my shapes) {
g.setColor(shape color);
if (oval) g.fillOval(...);
else g.fillRect(...);
}
}
}
以前的代码有效:
public class MyVisualView extends JFrame implements MyViews {
public void run() {
shapes = getShapes();
JPanel panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
// same paintComponent as above
}
};
while (true) {
panel.repaint();
// wait for a certain amount of time
}
}
}
编辑:通过重新绘制JFrame而不是JPanel来解决它
答案 0 :(得分:0)
但是,我遇到的问题是:Graphics对象似乎只是为每个paintComponent调用叠加了新形状
@Override
public void paintComponent(Graphics g) {
for (all of my shapes) {
代码应为:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (all of my shapes) {
在重新绘制所有形状之前,您需要先调用面板的默认绘制以首先清除背景。
也:
while (true) {
panel.repaint();
请勿使用一会儿(true)循环进行动画制作。相反,您应该使用Swing计时器来安排动画。
看看Swing Tutorial。关于以下内容:
Custom Painting
-(即,您还应该覆盖getPreferredSize()
方法)How to Use Swing Timer
让您开始了解Swing每个功能的基础。