Использование графики из анонимного класса - PullRequest
1 голос
/ 26 апреля 2011

Это часть моего кода, которая выполняет какую-то анимацию;однако, похоже, что-то не так: всякий раз, когда я пытаюсь использовать переданный «g» внутри анонимного класса для рисования чего-либо, он ничего не делает, но когда я использую его вне анонимного класса (внутри метода rollBalls), он делает то, чтоэто должно сделать.Есть идеи почему?И как мне это исправить?Спасибо.

   protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        rollBalls(g);
    }


    private void rollBalls(final Graphics g) { //Roll all 3 balls on the bar
        new Timer(1, new ActionListener() { 
            @Override
            public void actionPerformed(ActionEvent e) {
                                   g.setColor(Color.red);
                                   g.fillRect(0, 0, 500, 500);
            }
        }).start();
    }

Ответы [ 3 ]

3 голосов
/ 26 апреля 2011

Ваша проблема в несколько раз, но прежде всего вы понимаете, что объект Graphics, переданный в метод paint или paintComponent, обычно не сохраняется и может быть удален после его завершения. Затем у вас есть логика программы, вызываемая из метода paintComponent, который никогда не должен выполняться. Вы не имеете полного контроля над тем, когда или даже если методы paint или paintComponent вызываются, и, следовательно, они не должны определять логику вашего приложения.

По этой причине вы не делаете графику Swing таким образом. Вместо этого установите таймер вне любого метода paintComponent, обновите его в полях класса, затем вызовите repaint () и попросите ваш paintComponent использовать эти поля класса для рисования по мере необходимости, на этот раз с стабильным объектом Graphics, который передается в него через параметры .

Я понимаю, что ваш код "просто пример", но вы делаете что-то неправильно, пытаясь рисовать прямо из actionPerformed. Вы просто не должны этого делать.

3 голосов
/ 26 апреля 2011

Я согласен с комментарием Hovercraft Full Of Eels.вы должны сделать что-то вроде этого

class MyClass extends JComponent{

MyClass(){
new Timer(1, new ActionListener() { 
            @Override
            public void actionPerformed(ActionEvent e) {
                 MyClass.this.repaint();
            }
        }).start();
}

 protected void paintComponent(Graphics g) {
         super.paintComponent(g);
         g.setColor(Color.red);
         g.fillRect(0, 0, 500, 500);
    }
0 голосов
/ 26 апреля 2011

Возможно, вы живете не в том потоке для обновления GUI?Попробуйте поместить команды рисования в анонимном классе в Runnable и передать их SwingUtilities.invokeLater.

Я не думаю, что это имеет какое-либо отношение к внутреннему классу.

...