Простая ошибка пользовательской окраски

Я только что снова начал кодировать и, кажется, забыл, как удваивать буфер. Это код, который у меня есть сейчас, и я не уверен, что мне не хватает. Когда я запускаю его, просто белый экран, без овала.

В чем ошибка рендеринга?

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JFrame;

public class Graphs extends JFrame {

private Image dbImage;
private Graphics dbg;

public static void main(String[] args) {
    new Graphs();
}

public Graphs() {
    setSize(1000, 600);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    setTitle("Graphs");
    setLocationRelativeTo(null);
    setVisible(true);
}

public void paint(Graphics g) {
    dbImage = createImage(getWidth(), getHeight());
    dbg = dbImage.getGraphics();
    paintComponent(dbg);
    dbg.drawImage(dbImage, 0, 0, this);
}

public void paintComponent(Graphics g) {
    g.drawOval(200, 200, 200, 200);
    repaint();
}
}

Обновление: ошибка компиляции на @Override

The method  paintComponent(Graphics) of type Graphs must override or implement a supertype method.

1 quick fix available:
-> Remove '@Override' annotation

person user1596097    schedule 24.01.2013    source источник
comment
Похоже на DUPLICATE   -  person Jayamohan    schedule 24.01.2013
comment
public void paintComponent(Graphics g) { - Сделай @Override public void paintComponent(Graphics g) { сюрприз! Совет: вместо этого рисуйте на заказ в JPanel. Добавьте это в контейнер верхнего уровня.   -  person Andrew Thompson    schedule 24.01.2013
comment
добавить аннотацию @Override к методу paintComponent? prntscr.com/q7dit   -  person user1596097    schedule 24.01.2013
comment
Пожалуйста, не публикуйте изображения вашей IDE (или ссылки на них). Скопируйте/вставьте ошибку и код как редактирование вопроса.   -  person Andrew Thompson    schedule 24.01.2013
comment
Извините, сэр... Я просто пытался показать вам, что удивление, которое я получил от вашего предложения, дало мне ошибку. Я уже пытался добавить аннотацию @Override к методу рисования, но это не работает.   -  person user1596097    schedule 24.01.2013
comment
Это было задумано как «совет дзен», чтобы привести вас к пониманию того, почему нотация @Override важна — для выяснения, когда вы думаете, что переопределяете существующий метод, но на самом деле создание нового метода! +1 за публикацию кода, в котором проблемы были очевидны, и за быстрое принятие ответа. :)   -  person Andrew Thompson    schedule 24.01.2013


Ответы (2)


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

dbg.drawImage(dbImage, 0, 0, this);

с участием

g.drawImage(dbImage, 0, 0, this);

Также лучше не переопределять paint в контейнере верхнего уровня, а переопределять paintComponent в подклассе JComponent. Также не забудьте позвонить

super.paintComponent(g);
person Reimeus    schedule 24.01.2013

  1. Вам следует избегать переопределения метода paint компонентов верхнего уровня
    (таких как JFrame), основная проблема для вас заключается в том, что они не буферизуются дважды, как компоненты, которые расширяются от JComponent
  2. Не дозвониться до super.paint — это ОЧЕНЬ, ОЧЕНЬ плохо. Вы в основном запрещаете рамке рисовать любой из своих дочерних компонентов...
  3. Вы не должны загружать изображения в методе paint, это замедлит любые будущие перерисовки.
  4. Вы никогда не должны вызывать repaint из любого метода paintXxx, это приведет к созданию бесконечного цикла рисования, быстро пожирающего циклы вашего процессора.
  5. JFrame не имеет метода paintComponent.
  6. Предпочтительно, чтобы пользовательское рисование выполнялось JComponent (например, JPanel) с помощью метода paintComponent.

Обновить с помощью примера

введите здесь описание изображения

public class BadPaint10 {

    public static void main(String[] args) {
        new BadPaint10();
    }

    public BadPaint10() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new PaintPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintPane extends JPanel {

        private BufferedImage background;

        public PaintPane() {
            try {
                background = ImageIO.read(new File("C:/Users/shane/Dropbox/pictures/436px-Work_with_exotic_creatures.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (background != null) {
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g.drawImage(background, x, y, this);

                x = (getWidth() - 200) / 2;
                y = (getHeight() - 200) / 2;
                g.setColor(Color.RED);
                g.drawOval(x, y, 200, 200);

            }

        }
    }
}

Как уже отмечалось, важен приоритет. Порядок рисования элементов повлияет на результат.

Вы можете найти

Полезный.

person MadProgrammer    schedule 24.01.2013