Панель не показана для 2D анимации - PullRequest
0 голосов
/ 25 июля 2010

Я пытался создать 2D-анимацию на Java движущейся линии на панели (линия, перемещающаяся из одной точки в другую на панели).Я надеюсь, что это возможно.Вот код, который я использовал.

private void movingline(int length) throws InterruptedException {
        for(int i = 0; i + length < width; i++){
            for(int j = 0; j + length < height; j++){
                 eraseline(); 
                 drawLine(Color.cyan, i, j, i+length, j+length);
                 erase = true;
            }
        }
    }

    private void eraseline() {
        if(erase){
            fillCanvas(Color.BLUE);
        }
    }

При запуске кода Panel не отображается.

Вот код для рисования линии.

 public void drawLine(Color c, int x1, int y1, int x2, int y2) {
        int pix = c.getRGB();
        int dx = x2 - x1;
        int dy = y2 - y1;
        canvas.setRGB(x1, y1, pix);
        if (dx != 0) {
            float m = (float) dy / (float) dx;
            float b = y1 - m*x1;
            dx = (x2 > x1) ? 1 : -1;
            while (x1 != x2) {
                x1 += dx;
                y1 = Math.round(m*x1 + b);
                canvas.setRGB(x1, y1, pix);
            }
        }
        repaint();
    }

При запуске кода Panel не отображается с движущейся линией.Любая помощь приветствуется.

1 Ответ

2 голосов
/ 25 июля 2010

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

Решение состоит в том, чтобы обернуть действие (в частности, вызовы eraseLine и drawLine) в Runnable и вызвать этот Runnable, используя SwingUtilities.invokeAndWait().


EDIT : графические компоненты Java на самом деле не позволяют вам самостоятельно управлять холстом. Только компоненты сами делают какие-либо рисунки, и только тогда, когда их призывают рисовать сами. Непосредственное рисование на холсте, даже если бы вы могли заставить его работать, будет плохо работать, потому что вы будете мешать тому, что делает компонент.

Вместо того, чтобы вдаваться в более подробные объяснения, я пошел и реализовал, как мне кажется, «правильный» способ сделать это.

http://pastebin.com/etfmKbjj

Кодирование комментируется там, где это необходимо, надеюсь, оно даст вам некоторые идеи. Для получения дополнительной информации прочтите официальные учебные пособия по Swing и Graphics .

.
...