Быстрый вопрос перекраски (Canvas Object) - PullRequest
1 голос
/ 01 ноября 2010

Новые детали:

Метод перекраски моего объекта JPanel не работает при вызове изнутри события actionPerformed моего основного класса.Он работает внутри метода ImageViewer основного класса ImageViewer, но не работает внутри метода actionPerformed этого класса.

Это основные части моего кода, которые не работают должным образом (перерисовка):

Основной класс:

/**
 * @(#)NeatImageViewer.java
 *
 * NeatImageViewer application
 *
 * @author
 * @version 1.00 2010/11/1
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;


public class NeatImageViewer extends JFrame implements ActionListener {

    GraphicsPanel gp;

    NeatImageViewer() {
               //... window components ...
    }

    public static void main(String[] args) {

        NeatImageViewer niv = new NeatImageViewer();
        niv.setSize(500,500);
        niv.setLocationRelativeTo(niv);
        niv.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
            //...
                gp = new GraphicsPanel();
                gp.img = img;
                gp.repaint(); //<!--- Not Working!
                this.add(gp);
            //...
    }

}

Класс графической панели:

/**
 * @(#)GraphicsPanel.java
 *
 *
 * @author
 * @version 1.00 2010/11/1
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;


public class GraphicsPanel extends JPanel {
    BufferedImage img;

    GraphicsPanel() {
        super();
    }

    protected void paintComponent(Graphics g) {
        //paint method isn't executed???
        super.paintComponent(g);
        System.out.println("Paint!");
    }

}

Ответы [ 3 ]

1 голос
/ 01 ноября 2010

Вы должны переопределить paintComponent(Graphics g) вместо paint(Graphics g).
Таким образом, опубликованный вами метод должен быть переименован в paintComponent.

РЕДАКТИРОВАТЬ: Есть ли у вас pack() Вы редактировали кадр, когда инициализация завершена?

РЕДАКТИРОВАТЬ: Метод repaint() ничего не делает, когда компонент не виден.Итак, вы должны сначала добавить его в JFrame, pack() фрейм.После упаковки перекраска больше не нужна.

0 голосов
/ 02 ноября 2010

(я Skyfe, но с другого IP, поэтому я не "залогинился" и не смог прокомментировать)

Извините, но я не понимаю, в чем проблема ???

Я предложил свой код, и он НЕ выполняет функцию paintComponent при вызове repaint из метода actionPerformed. Просто скопируйте, вставьте мой код и скомпилируйте его с помощью Java-компилятора, и он НЕ выполняет метод paintComponent при выполнении действия, которое я могу сказать, потому что я использовал метод System.out.println () внутри метода paint. И нет, он ничего не рисует, потому что я просто пытаюсь проверить, вызывает ли он метод рисования ВСЕ, потому что я поместил системный вывод в метод paintComponent, который не выполняется при использовании перерисовки. Это был просто тест, и он не работал.

Итак, что вы подразумеваете под SSCCE, это весь код, который у меня есть. Я скомпилировал именно тот код, который выложил в своем основном посте, и проблема в том, что он не показывает какой-либо системный вывод при выполнении действия (и вызвано событие перерисовки). Я не вижу, что пропускает в моем посте?

0 голосов
/ 01 ноября 2010

В Swing вы не используете Canvas.Вы делаете пользовательское рисование на JPanel или JComponent и переопределяете метод paintComponent (...), как уже было сказано.Прочтите учебник Swing по Custom Painting для получения дополнительной информации и рабочих примеров.

Кроме того, в Swing нет необходимости создавать собственные компоненты для отображения изображения.Вы просто используете JLabel с ImageIcon.Прочтите раздел «Как использовать значки».

Добавьте в закладки учебник по всем основам Swing.

Редактируйте:

Когда вы добавляете компонент в видимый графический интерфейсосновной код должен быть:

panel.add( ... );
panel.revalidate();
panel.repaint();
...