Поведение перерисовки Java Graphics - PullRequest
5 голосов
/ 02 января 2012

Я уже давно ищу причину такого поведения в своем коде.Я не хочу погружаться слишком глубоко в Swing API, чтобы понять, почему это происходит.Буду признателен за любую информацию о причинах этой проблемы.

Это упрощенная версия приложения, которое я пишу, проблемы возникают, когда я нажимаю кнопку Draw в первый раз, изображение не будет рисовать на панели., но когда я щелкну по нему во второй раз, изображение будет идеально нарисовано.Любой рисунок, выполненный после, будет работать правильно, но первоначальная проблема с краской меня сильно раздражает.Спасибо за любую помощь!:)

public class ImageTester {

public static void main(String[] args) {
    final JFrame window = new JFrame("Image Tester");
    final JPanel pane = new JPanel();
    JButton draw = new JButton("Draw");
    JButton paint = new JButton("Paint");

    Toolkit k = Toolkit.getDefaultToolkit();
    final Image i = k.createImage("tester.jpg");
    //pane.getGraphics().drawImage(i, 22, 15, null);

    draw.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            System.out.println(pane.getGraphics());
            pane.getGraphics().drawRect(5, 5, 15, 15);
            pane.getGraphics().drawImage(i, 15, 15, null);
            System.out.println("Performance");
        }
    });

    paint.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

        }
    });

    pane.add(draw);
    pane.add(paint);
    window.add(pane);
    window.setVisible(true);
    window.setSize(new Dimension(400, 400));
    window.setLocationRelativeTo(null);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Ответы [ 3 ]

5 голосов
/ 02 января 2012

Помимо совета Camickr ..

Изображения загружаются асинхронно с использованием Toolkit.createImage(). Либо используйте ImageIO.read(URL/File/InputStream), либо добавьте MediaTracker.


Е.Г.

При первом запуске вижу.

enter image description here

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.URL;
import javax.imageio.ImageIO;

public class ImageTester {

public static void main(String[] args) throws Exception {
    final JFrame window = new JFrame("Image Tester");
    JButton draw = new JButton("Draw");
    JButton paint = new JButton("Paint");

    final Image i = ImageIO.read(new URL(
        "http://pscode.org/media/citymorn2.jpg"));

    ImagePanel gui = new ImagePanel();
    gui.setImage(i);
    draw.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
        }
    });

    paint.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
        }
    });

    gui.add(draw);
    gui.add(paint);
    window.add(gui);
    window.setVisible(true);
    window.setSize(new Dimension(400, 400));
    window.setLocationRelativeTo(null);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

class ImagePanel extends JPanel {

    Image i;

    public void setImage(Image image) {
        i = image;
    }

    public void paintComponent(Graphics g) {
        //System.out.println(pane.getGraphics());
        super.paintComponent(g);
        g.drawRect(5, 5, 15, 15);
        g.drawImage(i, 15, 15, null);
        System.out.println("Performance");
    }
}
1 голос
/ 02 января 2012

Когда вы используете createImage(), данные изображения загружаются, но они не преобразуются в визуализируемые пиксели, пока не узнают, на каком компоненте они будут нарисованы.Метод Toolkit.prepareImage() может сделать это.Добавьте эту строку в конец вашей программы, и проблема рисования исчезнет:

k.prepareImage(i, -1, -1, pane);
1 голос
/ 02 января 2012

Не используйте метод getGraphics ().Это рисование будет потеряно в следующий раз, когда Swing определит, что компонент должен перекраситься.

Пользовательское рисование выполняется путем переопределения метода paintComponent () в JPanel (или JComponent), а затем вы добавляете панель в рамку..

См. Custom Painting для получения дополнительной информации и примеров.

...