[英]Painting on a JPanel inside a JScrollPane doesn't paint in the right location
所以我有一个JPanel
在JScrollPane
内部。 现在,我试图在面板上绘画一些东西,但是它总是在同一位置。 我可以向各个方向滚动,但不会移动。 我在面板上绘制的所有内容都不会滚动。
我已经尝试过:
JViewPort
我也考虑过覆盖面板的paintComponent
方法,但这确实很难在我的代码中实现。
public class ScrollPanePaint{
public ScrollPanePaint() {
JFrame frame = new JFrame();
final JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(1000, 1000));
//I tried both true and false
panel.setOpaque(false);
JScrollPane scrollPane = new JScrollPane(panel);
frame.add(scrollPane);
frame.setSize(200, 200);
frame.setVisible(true);
//To redraw the drawing constantly because that wat is happening in my code aswell because
//I am creating an animation by constantly move an image by a little
new Thread(new Runnable(){
public void run(){
Graphics g = panel.getGraphics();
g.setColor(Color.blue);
while(true){
g.fillRect(64, 64, 3 * 64, 3 * 64);
panel.repaint();
}
}
}).start();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new ScrollPanePaint();
}
});
}
}
我犯的错误很容易解决,但是我不知道如何解决。
如何在JPanel
上实现paintComponent()
?
覆盖getPreferredSize()
方法,而不是使用setPreferredSize()
final JPanel panel = new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
// your custom painting code here
}
@Override
public Dimension getPreferredSize() {
return new Dimension(40, 40);
}
};
一些要点:
重写JComponent#getPreferredSize()而不是使用setPreferredSize()
阅读更多我应该避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法吗?
使用Swing Timer代替更适合Swing应用程序的Java Timer 。
了解更多如何使用Swing计时器
使用UIManager.setLookAndFeel()设置默认外观
阅读更多内容如何设置外观
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.