Поэтому у меня есть 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();
}
});
}
}
Ошибка, которую я делаю, вероятно, очень легко исправить, но я просто не могу понять, как это сделать.
Как реализовать paintComponent()
на JPanel
?
Переопределить 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()
Read more Должен ли я избегать использования методов Set (Preferred | Maximum | Minimum) Minimum в Java Swing?
Используйте Swing Timer вместо Java Timer, который больше подходит для приложения Swing.
Подробнее о том, как использовать качающиеся таймеры
Установите внешний вид по умолчанию, используя UIManager.setLookAndFeel()
paintComponent()
вJPanel
?