所以我有一个 JSplitPane 和两个 JPanel - 一个在顶部,一个在底部。在两个面板中,我都覆盖了paintComponent 方法并添加了我自己的图形。在底部面板中,我想添加一个动画。当面板不重新绘制时,这很好,但是一旦 Timer (javax.swing.Timer) 开始调用重新绘制,底部面板就会模仿顶部面板的外观并出现故障。实际动画并未刷新,而是不断添加(就像拖动的画笔而不是移动的对象)。
下面是底部面板类的代码:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
import javax.swing.Timer;
public class WaitControls extends JPanel {
private int pos;
public WaitControls(){
setBackground(Color.gray);
pos = 0;
}
public void progress(){
//animation timer:
Timer timer = new Timer(30, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
pos++;
repaint();
}
});
timer.start();
}
@Override
public void paintComponent(Graphics g){
g.fillRect(pos, pos, 10, 20);
}
}
这是 Splitpane 类的代码:
//my classes (imported packages)
import rcc.controls.ControlPanel;
import rcc.controls.InitControls;
import rcc.controls.WaitControls;
import rcc.video.Screen;
import javax.swing.JSplitPane;
public class MainPanel extends JSplitPane{
public RCC rcc;
public Screen screen;
private int height;
public ControlPanel curPanel;
public MainPanel(RCC rcc, Screen screen, int height){
super(JSplitPane.VERTICAL_SPLIT);
this.rcc = rcc;
this.screen = screen;
this.height = height;
setDividerSize(2);
setEnabled(false);
setTopComponent(screen);
setToInitControls();
}
//sets the control panel to init controls ***WORKS FINE***
public void setToInitControls(){
InitControls initCtrls = new InitControls(this);
setBottomComponent(initCtrls);
curPanel = initCtrls;
setDividerLocation(height / 4 * 3);
}
//sets the control panel to wait controls (trying to connect) ***GLITCHES***
public void setToWaitControls(){
WaitControls waitCtrls = new WaitControls();
setBottomComponent(waitCtrls);
curPanel = waitCtrls;
setDividerLocation(height / 4 * 3);
waitCtrls.progress();
}
}
顶部面板有点复杂。它涉及鼠标操作(包括 MouseEntered 侦听器)和动画以与用户鼠标输入进行交互。奇怪的是,我有另一个底部面板被换掉了,它也使用动画和一个计时器,并且没有这个故障。
有什么想法可能导致这种情况吗?谢谢你的帮助!