Java перерисовывает не правильно отображающий компонент - PullRequest
3 голосов
/ 30 марта 2012

Я разрабатываю приложение с графическим интерфейсом, используя JSWing, загружаю файл XML, затем десериализую его, затем добавляю все созданные объекты в JPanel. Однако до тех пор, пока я не переместлю окно или не нажму на панель, они выглядят так:

enter image description here

После того, как я переместил окно, они выглядят правильно, так как решить эту проблему <</p>

я посмотрел по этой ссылке http://docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paintComponent(java.awt.Graphics) и это может быть ответом, так как в конструкторе JComponent я использую

setOpaque(true);

но я все еще не уверен, как решить проблему, так как эту часть документации очень трудно понять (это как-то просто не имеет никакого смысла для меня :-D)

кстати, сама картина выглядит примерно так

for (NetObject o : objects) {

                addNewObject(o);
            }

и addNewObject (не весь код)

public void addNewObject(NetObject o) {



         DraggableComponent object = new DraggableComponent(o, editorIndex); //Creates a draggableComponent
        this.add(object);//Adds this component to main container

        object.setOverbearing(true); //On click ,this panel gains lowest z-buffer


            object.setSize(48, 48);
            object.setLocation(o.x - 23, o.y - 23);
            object.setBackground(Color.WHITE);
            this.repaint(); //this = JPanel

} * * тысяча двадцать-один

и переопределенный код PaintComponent

@Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (isOpaque()) {
            if (object.type == 2) { //tarnsition
                g.drawImage(transition, 0, 0, this);

            } else if (object.type == 1) {
                boolean test = g.drawImage(place, 0, 0, this); //place
                g.drawString(object.loadTokens(), 3, 27); // 1,2,3,4...
            }
        }

    }

Я пытался вызвать this.revalidate - после FOR EACH LOOP - не помогло, единственный способ, который работает, это как-то перемещаться с окном, как ни странно, эта проблема существует только @ Windows, мой коллега разрабатывает это точно такое же приложение под Linux, и у него нет проблем с графикой.

Я знаю, что подобных тем было очень много, но я, честно говоря, не смог найти решение.

Спасибо за ответ, Осирис

1 Ответ

4 голосов
/ 30 марта 2012

API setBackground() упоминает, что "это зависит от внешнего вида и чувства, чтобы соблюдать это свойство, некоторые могут игнорировать его".Задайте цвет графического контекста явно в paintComponent() и вызовите fillRect().

...