2010-03-25 111 views
1
 
package test; 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.Ellipse2D; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 
public class test_bmp extends JPanel implements MouseListener,MouseMotionListener,ActionListener 
{ 
static BufferedImage image; 
Color color; 
Point start=new Point(); 
Point end =new Point(); 
JButton elipse=new JButton("Elipse"); 
JButton rectangle=new JButton("Rectangle"); 
JButton line=new JButton("Line"); 
String selected; 
public test_bmp() 
    { 
    color = Color.black; 
    setBorder(BorderFactory.createLineBorder(Color.black)); 
    addMouseListener(this); 
    addMouseMotionListener(this); 
    } 
public void paintComponent(Graphics g) 
{ 
    //super.paintComponent(g); 
    g.drawImage(image, 0, 0, this); 
    Graphics2D g2 = (Graphics2D)g; 
    g2.setPaint(Color.black); 
    if(selected=="elipse") 
     { 
     g2.drawOval(start.x, start.y, (end.x-start.x),(end.y-start.y)); 
     System.out.println("Start : "+start.x+","+start.y); 
     System.out.println("End : "+end.x+","+end.y); 
     } 
     if(selected=="line") 
     g2.drawLine(start.x,start.y,end.x,end.y); 
} 
//Draw on Buffered image 
public void draw() 
    { 
     Graphics2D g2 = image.createGraphics(); 
     g2.setPaint(color); 
     System.out.println("draw"); 
     if(selected=="line") 
     g2.drawLine(start.x, start.y, end.x, end.y); 
     if(selected=="elipse") 
     { 
     g2.drawOval(start.x, start.y, (end.x-start.x),(end.y-start.y)); 
      System.out.println("Start : "+start.x+","+start.y); 
     System.out.println("End : "+end.x+","+end.y); 
     } 
     repaint(); 
     g2.dispose(); 
     } 
public JPanel addButtons() 
{ 
    JPanel buttonpanel=new JPanel(); 
    buttonpanel.setBackground(color.lightGray); 
    buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.Y_AXIS)); 
    elipse.addActionListener(this); 
    rectangle.addActionListener(this); 
    line.addActionListener(this); 
    buttonpanel.add(elipse); 
    buttonpanel.add(Box.createRigidArea(new Dimension(15,15))); 
    buttonpanel.add(rectangle); 
    buttonpanel.add(Box.createRigidArea(new Dimension(15,15))); 
    buttonpanel.add(line); 
    return buttonpanel; 
} 
public static void main(String args[]) 
{ 
    test_bmp application=new test_bmp(); 
    //Main window 
    JFrame frame=new JFrame("Whiteboard"); 
    frame.setLayout(new BorderLayout()); 
    frame.add(application.addButtons(),BorderLayout.WEST); 
    frame.add(application); 
    //size of the window 
    frame.setSize(600,400); 
    frame.setLocation(0,0); 
    frame.setVisible(true); 
    int w = frame.getWidth(); 
     int h = frame.getHeight(); 
     image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2 = image.createGraphics(); 
     g2.setPaint(Color.white); 
     g2.fillRect(0,0,w,h); 
     g2.dispose(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
@Override 
public void mouseClicked(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
} 
@Override 
public void mouseEntered(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
} 
@Override 
public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
} 
@Override 
public void mousePressed(MouseEvent event) 
{ 
    start = event.getPoint(); 
} 
@Override 
public void mouseReleased(MouseEvent event) 
{ 
    end = event.getPoint(); 
    draw(); 
} 
@Override 
public void mouseDragged(MouseEvent e) 
{ 
    end=e.getPoint(); 
    repaint(); 
} 
@Override 
public void mouseMoved(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void actionPerformed(ActionEvent e) 
{ 
    if(e.getSource()==elipse) 
    selected="elipse"; 
    if(e.getSource()==line) 
    selected="line"; 
    draw(); 

} 
} 

我需要創建一個繪畫應用程序。當我通過從左向右拖動鼠標繪製橢圓時,它不顯示任何內容。爲什麼?我應該在這裏使用其他功能嗎?爲什麼我不能用這個代碼繪製一個橢圓?

回答

6

您的程序確實當您向下並向右拖動鼠標時繪製一個橢圓。它向上拖動和/或向左拖動不起作用,因爲Graphics.drawOval不支持負寬度或高度。

嘗試添加方法是這樣的:

private Shape createEllipse() { 
    Ellipse2D e = new Ellipse2D.Double(); 
    e.setFrameFromDiagonal(start, end); 
    return e; 
} 

然後從draw調用它,paintComponent這樣的:

if(selected=="elipse") { 
    g2.draw(createEllipse()); 
} 

你也可能不需要調用draw()actionPerformed結束。如果在線和橢圓模式之間切換,它將繪製一個橢圓,其座標與最近的線相同,反之亦然。

還有一種編碼風格問題:使用selected的字符串文字很混亂(儘管它確實有效)。我將定義一個枚舉。

+0

感謝它的工作正常,但我不能在這裏得到邏輯。任何解釋 ? – swift 2010-03-25 10:45:32

+0

該方法的目的是在對角處的一個角落(可以是四個角落中的任何一個)和「結束」構建具有「開始」的矩形,並使用該矩形作爲橢圓的邊界框。我改變它使用'setFrameFromDiagonal'。我希望現在更清楚。 – finnw 2010-03-25 14:58:04

相關問題