Почему моя панель рисования, иногда рисует, а иногда нет, при изменении размера окна? - PullRequest
1 голос
/ 12 марта 2012

У меня есть это простое приложение, в котором команда, подобная RECT 10 20 100 150, рисует прямоугольник с заданными аргументами на DrawPanel (расширяет JPanel).

Также, после отрисовки примитива, он добавляет его к List<String> cmdList;, так что в
paintComponent(Graphics g) DrawPanel я перебираю список, обрабатываю каждую команду и рисую каждую из них.

Проблема, с которой сталкивается , заключается в том, что послеРисование нескольких фигур и изменение размера (или увеличение) панели становятся пустыми.И при повторном изменении размеров несколько раз все shpaes отображаются правильно.

Это скриншот после рисования нескольких примитивов.enter image description here

После растяжения окна немного влево, примитивы исчезли.enter image description here

Код для DrawPanel

public class DrawPanel extends JPanel {

    private List<String> cmdList;
    public final Map<String,Shape> shapes;

    public DrawPanel()
    {
        shapes = new HashMap<String,Shape>();
        shapes.put("CIRC", new Circ());
        shapes.put("circ", new Circ());
        shapes.put("RECT", new Rect());
        shapes.put("rect", new Rect());
        shapes.put("LINE", new Line());
        //... and so on

        cmdList = new ArrayList<String>();
    }
    public void addCmd(String s)
    {
        cmdList.add(s);
    }
    public void removeCmd()
    {
        cmdList.remove(cmdList.size());
    }
    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);

        setBackground(Color.BLACK);

        for (int i = 0;  i < cmdList.size(); ++i){
            StringTokenizer cmdToken = new StringTokenizer(cmdList.get(i));

            String cmdShape = cmdToken.nextToken(); 
            int []args = new int[cmdToken.countTokens()];

            for(int i1 = 0; cmdToken.hasMoreTokens(); i1++){
                args[i1] = Integer.valueOf(cmdToken.nextToken());
            }

            shapes.get(cmdShape).draw(this, args);
        }
    }

    public void getAndDraw(String cmdShape, int[] args)
    {
        shapes.get(cmdShape).draw(this, args);
    }
    public void rect(int x1, int y1, int width, int height)
    {
        Graphics g = getGraphics();
        g.setColor(Color.BLUE);
        g.drawRect(x1, y1, width, height);
    }
    public void circ(int cx, int cy, int radius)
    {
        Graphics g = getGraphics();
        g.setColor(Color.CYAN);
        g.drawOval(cx - radius, cy - radius, radius*2, radius*2);
    }
}

Частичный код для Форма (Интерфейс)

public interface Shape {
    void draw(DrawPanel dp, int[] data);
}

class Rect implements Shape {
    public void draw(DrawPanel dp, int[] data) {
        dp.rect(data[0], data[1], data[2], data[3]);
    }
}

Линии, используемые в MainFrame (расширяет JFrame) для рисования после ввода каждой команды.

drawPanel.getAndDraw(cmdShape, args);
drawPanel.addCmd(cmd);

Почему панель рисования, иногда рисование, а иногда нет, при изменении размера окна?
Как получить стабильный вывод?

Примечание. Если я что-то пропустил, спросите.

1 Ответ

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

Это потому, что вы используете getGraphics (), когда вы должны использовать объект Graphics, переданный в качестве аргумента paintComponent.

Oh, и, кстати, setBackground (Color.BLACK) должен быть в конструкторе, а не вметод paintComponent.

...