JPanel пользовательский рисунок с использованием графики - PullRequest
5 голосов
/ 16 августа 2011

У меня есть пользовательский JPanel, и иногда во всей моей программе мне нужно вызывать метод, который окрашивает экран в черный цвет, вот и все.

public void clearScreen() {
    Graphics g = getGraphics();
    g.setColor(Color.black);
    g.fillRect(0,0,getWidth(),getHeight());
}

Когда я запускаю программу, я вызываю этот метод.

Однако я считаю, что иногда это работает, а иногда нет. Это очень странно. Я также обнаружил, что когда он не работает, графический объект НЕ является нулевым, и ширина и высота также правильно определены (из getWidth () и getHeight ()).

Почему это иногда работает, а иногда не работает?

Как правильно сделать собственный рисунок на моей JPanel в какой-то момент в программе? Правильно ли использовать getGraphics (), как я делаю? В моем JPanel (в какой-то момент) есть JComponents, но позже я удаляю эти JComponents и делаю некоторые графические рисунки. Почему это иногда только работает?

1 Ответ

14 голосов
/ 16 августа 2011

Не получайте ваш объект Graphics, вызывая getGraphics для компонента, такого как JPanel, поскольку полученный объект Graphics не будет сохраняться при следующем перерисовке (что, вероятно, является источником ваших проблем).

Вместо этогорассмотрите возможность выполнения всего вашего рисунка в BufferedImage, и , а затем вы можете использовать getGraphics () для вашего сердца.Если вы сделаете это, не забудьте утилизировать объект Graphics, когда закончите рисовать с ним.

например,

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MyPaint extends JPanel {
   public static final int IMG_WIDTH = 400;
   public static final int IMG_HEIGHT = IMG_WIDTH;

   private BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT,
            BufferedImage.TYPE_INT_ARGB);

   public MyPaint() {
      MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
      addMouseListener(myMouseAdapter);
      addMouseMotionListener(myMouseAdapter);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (image != null) {
         g.drawImage(image, 0, 0, null);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(IMG_WIDTH, IMG_HEIGHT);
   }

   public void clearScreen() {
      Graphics g = image.getGraphics();
      g.setColor(Color.black);
      g.fillRect(0, 0, image.getWidth(), image.getHeight());
      g.dispose();
      repaint();
   }

   private class MyMouseAdapter extends MouseAdapter {
      // code to draw on the buffered image. 
      // Don't forget to call repaint() on the "this" JPanel
   }
}
...