Изменить местоположение JLabel на JPanel перекрасить - PullRequest
1 голос
/ 16 марта 2012

Я создаю Java-приложение.GameView имеет BoardView, который содержит несколько PawnView (в примере только один).

Пример:

    public class GameView extends Frame
    {
        public GameView()
        {
            AWTUtilities.setWindowOpaque(this, false);
            this.setUndecorated(true);
            this.setLayout(null);
            this.setResizable(false);
            this._boardview = new BoardView();
            int x = 0;
            int y = 0;

            PawnView pv = new PawnView();
            this._boardview.AddPawn(pv, 10, 10);

            this._boardview.MovePawn(pv, 20, 10);
        }
    }

    public class BoardView extends JPanel
    {
        public BoardView()
        {
            this.setOpaque(false);
            RepaintManager.currentManager(null).setDoubleBufferingEnabled(true);
            this.setLayout(null);       
        }

        @Override
        public void update(Graphics g)
        {
            paint(g);
        }

        public void AddPawn(PawnView pawnview, int x, int y)
        {
            this.add(pawnview);
            pawnview.setLocation(x, y);
        }

        public void MovePawn(PawnView pawnview, int x, int y)
        {
            pawnview.setLocation(x, y);
            //this.repaint();
        }
    }

    public class PawnView extends JLabel
    {
        public PawnView()
        {
            this.setOpaque(false);
            RepaintManager.currentManager(null).setDoubleBufferingEnabled(true);
            this.setLayout(null);
        }
    }

Изначально все выглядит великолепно (без MovePawn):

http://dl.dropbox.com/u/7438271/1.png

Когда я вызываю MovePawn, это выглядит так:

http://dl.dropbox.com/u/7438271/2.png

Я пытался позвонить this.revalidate(), this.updateUI(), this.repaint(), this.paintImmediately()в разных формах, но все они ухудшают ситуацию: весь JPanel получает белый фон.

Я также пытался переопределить функцию paintComponent JPanel также без эффекта.

Это происходит только на MacOS X (полностью обновлено), но у меня также есть некоторые проблемы с перерисовкой в ​​Windows.

Может кто-нибудь помочь?

1 Ответ

3 голосов
/ 17 марта 2012

ваш код не работает,

1) не смешивает AWT Frame с компонентами Swing J, не уверен (никогда не тестировал), но я думаю, что AWTUtilities только для Swing JComponentтогда

public class GameView extends Frame

может быть

public class GameView extends JFrame

2)

this._boardview = new BoardView();

должно быть

BoardView _boardview = new BoardView();

3), почему причинатам строка кода,

RepaintManager.currentManager(null).setDoubleBufferingEnabled(true);

Я видел код для печати, где для более быстрой печати отключите двойную буферизацию, но значение currentManager(null), просто не дает мне никакого смысла

4)никогда не используйте public void update(Graphics g), этот метод используется внутри API, используйте paintComponent вместо

5) для перемещения с JComponents используйте Swing Timer с вызовом repaint()

6) JLabel по умолчанию прозрачный удалить this.setOpaque(false);

7) JLabel не получили ни одного LayoutManager ,удалить this.setLayout(null);

...