Проблема с пользовательским компонентом на качелях - PullRequest
1 голос
/ 10 марта 2010

Я не привык к разработке GUI, но теперь мне это нужно немного, и я хочу избежать чтения всей документации только из-за этой проблемы.

У меня проблемы с отображением пользовательского компонента, подобного тому, который я разместил ниже. Если я добавлю его в JFrame, он будет работать нормально, но я не смогу добавить больше одного, а если я добавлю его в JPanel, он вообще не будет отображаться.

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;

public class Test extends JComponent implements Runnable {

    private int c,x,y;

    public Test(int x,int y){
        c = 0;
        this.x = x;
        this.y = y;
    }

    private void inc(){
        c++;
        if(c>255){
            c = 0;
        }
    }

    public void paint(Graphics g) {
        g.setColor(new Color(c,c,c));
        g.fillRect(x, y, 50, 50);
    }

    public void run() {
        while(true){
            inc();
            try{
                Thread.currentThread().sleep(20);
            } catch (Exception e){
            }
            repaint();
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2010

и я хочу не читать все документация только из-за этого проблема.

Да, хорошее чтение действительно экономит время, потому что вы делаете вещи правильно с первого раза, и вам не нужно сидеть сложа руки в ожидании / надежде, что кто-то ответит на ваш вопрос.

Итак, начните с учебника Swing

1) Пользовательское рисование выполняется путем переопределения метода paintComponent (). Прочитайте раздел из учебника по Swing на тему "Custom Painting".

2) Анимация должна выполняться с использованием Swing Timer, см. Раздел из учебника «Как использовать таймеры».

3) На самом деле вам не нужно создавать пользовательский компонент. Все, что вам нужно сделать, это создать JPanel, установить его предпочтительный размер, а затем использовать таймер для изменения фона.

1 голос
/ 10 марта 2010

Как минимум, вы должны также установить setPreferredSize (x + 50, y + 50) и setMininumSize (x + 50, y + 50) в конструкторе, чтобы менеджер компоновки знал о размере вашего компонента для помещения его в контейнер виджет правильно.

Кроме того, вызов repaint () не из AWTEventThread довольно плох. Для этого используйте SwingUtilities.invokeLater ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...