2012-10-04 79 views
4

我在将鼠标拖到它上方时无法使自定义面板重新绘制自己。在拖动鼠标时Java Swing重绘

基本上,我有以下处理程序的自定义面板连接上绘制自由形式的线条:

MouseInputAdapter mia = new MouseInputAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       if(_app_split_right_buttons_radioInkBtn.isSelected()) { 
        _app_split_right_journal.StartLine(); 
        _app_split_right_journal.AddLineSegment(e.getX(), e.getY()); 
       } 
       _app_split_right_journal.repaint(); 
      } 
      @Override 
      public void mouseReleased(MouseEvent e) { 
       if(_app_split_right_buttons_radioInkBtn.isSelected()) { 
        _app_split_right_journal.AddLineSegment(e.getX(), e.getY()); 
        _app_split_right_journal.EndLine(); 
       } 
       _app_split_right_journal.repaint(); 
      } 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       if(_app_split_right_buttons_radioInkBtn.isSelected()) { 
        _app_split_right_journal.AddLineSegment(e.getX(), e.getY()); 
       } 
       _app_split_right_journal.repaint(); 
      } 
     }; 
     _app_split_right_journal.addMouseListener(mia); 
     _app_split_right_journal.addMouseMotionListener(mia); 

不过,我似乎无法得到它的,而我拖动鼠标重绘,只有在我释放后(线条正确绘制)。奇怪的是,如果在我的拖动中间,我右键单击,当我拖动时,该线会突然开始绘制。

任何帮助,将不胜感激。编辑:为了清楚起见,StartLine()/ AddLineSegment()/ EndLine()的东西只是将点添加到Point对象的ArrayList中,并且repaint()函数已被覆盖以遍历这些点并绘制线段之间。代码如下:

public void DrawShapes(Graphics g) { 
     g.setColor(Color.black); 
     for(Geometry.Shape shape : _shapeList) { 
      if(shape instanceof Geometry.Line) { 
       ArrayList<Point> points = ((Line) shape).GetPointList(); 
       Point p1 = points.get(0); 
       for(int i=1; i<points.size(); i++) { 
        Point p = points.get(i); 
        g.drawLine(p1.x, p1.y, p.x, p.y); 
        p1 = p; 
       } 
      } 
} 

编辑:把它弄出来。这是因为我正在循环查看线条列表,但是我忘了我没有添加我正在绘制的列表,直到我释放鼠标并调用EndLine()。我不得不在repaint()方法中放置单独的代码来绘制我当前处于绘制中间的形状。代码添加到重绘():

if(_currentShape instanceof Geometry.Line) { 
      ArrayList<Point> points = ((Line)_currentShape).GetPointList(); 
      Point p1 = points.get(0); 
      for(int i=1; i<points.size(); i++) { 
       Point p = points.get(i); 
       g.drawLine(p1.x, p1.y, p.x, p.y); 
       p1 = p; 
      } 
     } 
+0

尝试调用重绘上父母的容器以及/而不是 – MadProgrammer

回答

5

这是一个例子,我做了另外一个问题,但它使用鼠标拖动来画线到组件......

public class PaintingExample { 

    private BufferedImage bImage; 
    private ImageIcon image; 
    private JLabel imageLabel; 
    private int xClicked = 0; 
    private int yClicked = 0; 
    private int xDragged = 0; 
    private int yDragged = 0; 
    private MouseAdapter mouseListener = 
     new MouseAdapter() { 
      private boolean paint = false; 
      @Override 
      public void mousePressed(MouseEvent me) { 

       xClicked = me.getX(); 
       yClicked = me.getY(); 
       xDragged = xClicked; 
       yDragged = yClicked; 

       paint = true; 

      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 

       xClicked = -1; 
       xClicked = -1; 
       xDragged = -1; 
       yDragged = -1; 

       paint = false; 

      } 

      @Override 
      public void mouseMoved(MouseEvent me) { 
      } 

      @Override 
      public void mouseDragged(MouseEvent me) { 

       if (paint) { 

        xClicked = xDragged; 
        yClicked = yDragged; 

        xDragged = me.getX(); 
        yDragged = me.getY(); 

        xDragged = me.getX(); 
        yDragged = me.getY(); 

        Graphics2D g2 = bImage.createGraphics(); 
        g2.setColor(Color.WHITE); 
        g2.drawLine(xClicked, yClicked, xDragged, yDragged); 
        g2.dispose(); 
        imageLabel.setIcon(new ImageIcon(bImage)); 

        me.getComponent().repaint(); 

       } 

      } 
     }; 

    public PaintingExample() { 
     try { 
      bImage = ImageIO.read(new URL(
          "http://gagandeepbali.uk.to/" 
          + "gaganisonline/images/planetbackground.jpg")); 
      image = new ImageIcon(bImage); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private void displayGUI() { 
     JFrame frame = new JFrame("Painting on Image"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     imageLabel = new JLabel(image); 
     imageLabel.addMouseListener(mouseListener); 
     imageLabel.addMouseMotionListener(mouseListener); 

     contentPane.add(imageLabel); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new PaintingExample().displayGUI(); 
      } 
     }); 
    } 
} 
+0

今天帮助我。谢谢!!! –

+0

很高兴的帮助:D – MadProgrammer

+0

@MadProgrammer你杀了它!在这个主题上看到很多有用的答案 – user1282637