Проблемы обновления Java-апплета - PullRequest
0 голосов
/ 22 декабря 2008

У меня есть Java-апплет (JApplet). Этот апплет использует JComponent (PanelAux) для отображения значений и изображений, которые периодически изменяются. Но апплет не обновляется сам. Что я могу сделать, чтобы обновить мой апплет?

//--------------------------------------------RUN

public void run()
    while (true) {
        try {
            myThread.sleep(1000);
        } 
        catch (InterruptedException e){
        }    
        repaint();
    }
}
//--------------------------------------------PAINT
public void paint(Graphics g)
{     

    dim  = new Dimension(image.getWidth(this)+50,image.getHeight(this)+50);
    this.resize(dim);
    this.setMaximumSize(dim);
    this.setMinimumSize(dim);

    PanelAux panel = new PanelAux(image);   //JComponent

    add(panel);

    super.paint(g);
}

Спасибо

Ответы [ 3 ]

4 голосов
/ 22 декабря 2008

Вы действительно вызываете метод run () в любом месте запуска потока, который его использует?

Также: вы определенно не хотите добавлять новые компоненты в свой метод paint()! Это кричит о проблемах!

3 голосов
/ 22 декабря 2008

В качестве общего совета в статье Painting в AWT и Swing описывается, как следует выполнять перерисовку в AWT или Swing.

Поскольку вы упомянули, что используете JApplet, раздел « Живопись на Swing » будет здесь актуальным.

В частности, вместо Swing вместо перегрузки метода paint(Graphics g) следует использовать метод paintComponent(Graphics g) с вызовом метода paintComponent суперкласса. Цитата из раздела " Методы рисования ":

Программы Swing должны переопределять paintComponent() вместо переопределения paint().

Это потому, что сам метод paint разбит на три отдельных метода, переопределение самого метода paint означает, что он будет предотвращать вызовы paintComponent, paintBorder и paintChildren текущего класса и его классы предков.

Кроме того, для вызова метода run() ваш JApplet должен реализовывать Runnable, а также иметь новый Thread, вызываемый откуда-то внутри вашего апплета. (Возможно, в методах init или start.)

Edit:

Также следует отметить, что метод paintComponent будет вызываться каждый раз, когда необходимо обновить экран. Метод paintComponent будет вызываться несколько раз, так как saua указывает на , было бы не очень хорошей идеей создавать новые объекты в самом методе paintComponent.

Кроме того, похоже, что дизайн должен иметь отдельный поток (так как апплет, кажется, реализует интерфейс Runnable, как подразумевается из наличия run метода), обновление JComponent Состояние может иметь место в самом методе run, при необходимости вызывая метод repaint.

1 голос
/ 22 декабря 2008

Вы не должны отменять краску (Графика g).

Есть ли какие-либо исключительные ситуации в консоли апплета?

...