2014-01-15 12 views

ответ

2

getGraphics

  • Может быть null
  • Является «моментальный снимок» последнего процесса краски
  • Все раскрашенной будет потеряно на следующем цикле краски

Вы следует избегать использования getGraphics и просто использовать то, что прошло до метода paintComponent.

В теории нет никакой разницы между ними, но если вы хотите, что вы нарисовали, чтобы выжить между перерисовкой, то вы должны использовать paintComponent

Обновлены например

Без кода примера ехать я угадываю ... но ...

enter image description here

в основном, это имеет JPanel, что cts как основной «холст», который рисует изображение и, когда установлен, Rectangle, который действует как выбор.

Он использует второй класс как MouseListener на самом деле принимать решения о том, что рисовать

import java.awt.AlphaComposite; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Composite; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class MouseSelection { 

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

    public MouseSelection() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       ImagePane imgPane = new ImagePane(); 
       new MouseHandler(imgPane); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(imgPane); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class MouseHandler extends MouseAdapter { 

     private ImagePane imgPane; 

     private Point clickPoint; 

     public MouseHandler(ImagePane imgPane) { 
      this.imgPane = imgPane; 
      imgPane.addMouseMotionListener(this); 
      imgPane.addMouseListener(this); 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      imgPane.clearSelection(); 
      clickPoint = e.getPoint(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      clickPoint = null; 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      if (clickPoint != null) { 
       Point dragPoint = e.getPoint(); 

       int x = Math.min(clickPoint.x, dragPoint.x); 
       int y = Math.min(clickPoint.y, dragPoint.y); 
       int width = Math.max(clickPoint.x, dragPoint.x) - x; 
       int height = Math.max(clickPoint.y, dragPoint.y) - y; 

       imgPane.setSelection(new Rectangle(x, y, width, height)); 

      } 
     } 

    } 

    public class ImagePane extends JPanel { 

     private BufferedImage img; 
     private Rectangle selection; 

     public ImagePane() { 
      try { 
       img = ImageIO.read(new File("C:\\hold\\thumbnails\\issue459.jpg")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

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

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

       Color color = UIManager.getColor("Table.selectionBackground"); 
       g2d.setColor(color); 
       Composite comp = g2d.getComposite(); 
       g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f)); 
       g2d.fill(selection); 
       g2d.setComposite(comp); 
       g2d.draw(selection); 

      } 
      g2d.dispose(); 
     } 

     protected void clearSelection() { 
      selection = null; 
      repaint(); 
     } 

     protected void setSelection(Rectangle rectangle) { 
      selection = rectangle; 
      repaint(); 
     } 
    } 

} 
+0

Я спросил, потому что я рисую прямоугольник, когда указатель мыши перемещается, и когда я использую GetGraphics, а затем перекрасить есть мерцание, но когда я рисую прямоугольник, используя paintComponent, а затем перекрашивание работает отлично. Почему это происходит? –

+0

Мышь (вероятно), вызывающая срабатывание перерисовки, метод «paintComponent» (косвенно), вызываемый и заполняющий фон, отбрасывает то, что вы ранее нарисовали, используя 'getGraphics'. Обновите прямоугольник в методе 'paintComponent' вместо – MadProgrammer

+0

Проблема в том, что я делаю Rectangle в другом классе, чтобы переопределить поведение, если это необходимо, поэтому я попытался использовать getGraphics, но результаты не совсем хорошие. Есть ли способ сделать внешнюю картину, используя paintComponent? –

Смежные вопросы