2012-08-09 19 views
2

我有一個繪畫程序,我已經完成了所有按鈕和滑塊,但是我對實際繪畫本身有問題。當我將光標拖過屏幕而不是一條完整的線時,我幾乎得到了一條我不想要的虛線。下面是在JPanelBufferedImageMouseListener代碼:.drawLine()問題和緩衝圖像

 public void mouseDragged(MouseEvent e) { 
      Graphics g=buffered.getGraphics(); 
      g.setColor(mycol); 
       Graphics2D graph=(Graphics2D)g; 
      BasicStroke stroke=new BasicStroke(30); 
      graph.setStroke(stroke); 
       // g.fillRect(xcor, ycor, 20, 20); 
     //varx=e.getX(); 
      ycor=e.getY(); 
      xcor=e.getX(); 
      int bad=xcor; 
      int good=ycor; 
      graph.drawLine(xcor, ycor, bad, good); 
      // buffered.setRGB(xcor, ycor, mycol.getRGB()); 
      repaint(); 
      // g.drawLine(xcor, ycor, x, x) 
      repaint(); 


     } 
+1

我看來,你提供了錯誤的參數給'的drawLine()'方法,因爲值x1,y1是一樣X2,Y2。因此,點就是你的情況,你應該做的是'mouseClick()'存儲x1,y1,然後拖動get x2,y2。然後通過這兩個'drawLine(xClicked,yClicked,xDragged,yDragged)',這將使該行出現在你的情況:-) – 2012-08-09 18:33:13

回答

2

三十像素是一個非常寬的線,我可以想像,當無抗鋸齒繪製的,它要尋找非常鋸齒狀;這可能是你所看到的。你可能想嘗試像

graph.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_ON); 

在另一方面,也許你已經越來越抗鋸齒,並希望將其關閉;那麼

graph.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_OFF); 

其中一個保證會改變圖像的外觀;希望它會更符合你的喜好。

5
  • 只是爲了證明我的意見,我加入了這個答案,但在徵求意見略有 變化是在這裏,這是使用 mousePressed(...)而不是mouseClicked(...)
  • 還有一個另外的存在,因爲你想要的 的BufferedImageGraphics2D對象,而不是使用getGraphics()始終使用 createGraphics()它返回Graphics2D對象,因此你 真的不擔心在這個演員啄。

    請大家看看下面的例子:

======================

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

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() { 
     @Override 
     public void mousePressed(MouseEvent me) { 
      xClicked = me.getX(); 
      yClicked = me.getY(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent me) { 
      xDragged = me.getX(); 
      yDragged = me.getY(); 

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

    public PaintingExample() { 
     try { 
      bImage = ImageIO.read(new URL(
        "http://i.imgur.com/fHiBMwI.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() { 
      @Override 
      public void run() { 
       new PaintingExample().displayGUI(); 
      } 
     }); 
    } 
} 
+0

謝謝你解決了我的問題,並保存我再次寫出數百行代碼。 – 2012-08-11 22:25:33

+0

你最歡迎並保持微笑:-) – 2012-08-12 01:35:21

2

如果我正確理解您的問題,您將遇到的主要問題是您拖動鼠標時將收到的更新數量。

即使您拖慢速度,也不會總是收到每個像素移動的通知,而是系統會等待「空閒」狀態(或閾值)通知您,以便它「看起來」是平滑移動。

我能夠通過修改代碼來把這個稍微一起

Hello ;)

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().invalidate(); 
       me.getComponent().repaint(); 

      } 

     } 
    }; 

基本上,這個想法是從最後一個「已知位置」到當前位置畫一條線。

希望這是在棒球場