Рисование на JPanel внутри JScrollPane не рисует в нужном месте

1

Поэтому у меня есть JPanel что внутри JScrollPane. Теперь я пытаюсь что-то нарисовать на панели, но всегда в одном месте. Я могу прокручивать все направления, но это не движение. Все, что я рисую на панели, не прокручивается.

Я уже пробовал:

  1. Пользовательский JViewPort
  2. переключение между Opaque = true и Opaque = false

Также я рассмотрел возможность переопределения метода 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();
        }
    });
}

}

Ошибка, которую я делаю, вероятно, очень легко исправить, но я просто не могу понять, как это сделать.

  • 0
    Почему трудно реализовать метод paintComponent() в JPanel ?
  • 0
    Потому что весь мой код рисования должен быть внутри метода paintComponent JPanels. Мне нужно использовать другие подпрограммы. Как и мой класс сущности, который рисует сущность на JPanel, не может быть внутри метода paintComponent. Или я могу делать что-то действительно глупое.
Теги:
swing
draw
jpanel
jscrollpane

1 ответ

4
Лучший ответ

Как реализовать 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);
    }
};

Некоторые моменты:

  1. Переопределить JComponent # getPreferredSize() вместо использования setPreferredSize()

    Read more Должен ли я избегать использования методов Set (Preferred | Maximum | Minimum) Minimum в Java Swing?

  2. Используйте Swing Timer вместо Java Timer, который больше подходит для приложения Swing.

    Подробнее о том, как использовать качающиеся таймеры

  3. Установите внешний вид по умолчанию, используя UIManager.setLookAndFeel()

    Подробнее Как настроить внешний вид и почувствовать

  4. Как исправить задержки анимации в Java?

  • 0
    Все еще ищу, как внедрить этот код в мою игру, но он, безусловно, делает то, что я хочу. Спасибо :)
  • 0
    Так что полезные ссылки. Еще раз спасибо
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню