4
包装测试;

导入 java.awt.*;
导入 java.awt.event.*;
导入 java.awt.geom.Ellipse2D;
导入 java.awt.image.BufferedImage;
导入 javax.swing.*;
公共类 test_bmp 扩展 JPanel 实现 MouseListener,MouseMotionListener,ActionListener
{
 静态 BufferedImage 图像;
 颜色颜色;
 点开始=新点();
 点结束 =new Point();
 JButton 椭圆=新 JButton("椭圆");
 JButton 矩形=新 JButton("矩形");
 JButton line=new JButton("Line");
 选择字符串;
 公共 test_bmp()
    {
  颜色=颜色.黑色;
  setBorder(BorderFactory.createLineBorder(Color.black));   
  addMouseListener(this);
  addMouseMotionListener(this);
    }
 公共无效paintComponent(图形g)
 {
  //super.paintComponent(g);
  g.drawImage(图像, 0, 0, 这个);
  Graphics2D g2 = (Graphics2D)g;
  g2.setPaint(Color.black);
  如果(选择==“椭圆”)
        {
         g2.drawOval(start.x, start.y, (end.x-start.x),(end.y-start.y));
         System.out.println("开始:"+start.x+","+start.y);
         System.out.println("结束:"+end.x+","+end.y);
        }
        如果(选择==“行”)
         g2.drawLine(start.x,start.y,end.x,end.y);
 }
 //在缓冲图像上绘制
 公共无效绘制()
    {
        Graphics2D g2 = image.createGraphics();
        g2.setPaint(颜色);
      System.out.println("画");
        如果(选择==“行”)
         g2.drawLine(start.x, start.y, end.x, end.y);
        如果(选择==“椭圆”)
        {
         g2.drawOval(start.x, start.y, (end.x-start.x),(end.y-start.y));
            System.out.println("开始:"+start.x+","+start.y);
         System.out.println("结束:"+end.x+","+end.y);
        }
        重绘();
        g2.dispose();
        }  
 公共JPanel addButtons()
 {
  JPanel 按钮面板=新 JPanel();
  buttonpanel.setBackground(color.lightGray);
  buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.Y_AXIS));
  elipse.addActionListener(this);
  矩形.addActionListener(this);
  line.addActionListener(this);
  buttonpanel.add(椭圆);
  buttonpanel.add(Box.createRigidArea(new Dimension(15,15)));
  buttonpanel.add(矩形);
  buttonpanel.add(Box.createRigidArea(new Dimension(15,15)));
  buttonpanel.add(line);
  返回按钮面板;
 }
 公共静态无效主(字符串参数 [])
 {
   test_bmp 应用程序=新的 test_bmp();
   //主窗口
   JFrame frame=new JFrame("白板");   
   frame.setLayout(new BorderLayout());
   frame.add(application.addButtons(),BorderLayout.WEST);
   框架。添加(应用程序);
   //窗口大小
   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);
 }
 @覆盖
 公共无效mouseClicked(MouseEvent arg0){
  // TODO 自动生成的方法存根
 }
 @覆盖
 公共无效鼠标输入(鼠标事件 arg0){
  // TODO 自动生成的方法存根
 }
 @覆盖
 公共无效mouseExited(MouseEvent arg0){
  // TODO 自动生成的方法存根
 }
 @覆盖
 public void mousePressed(MouseEvent 事件)
 {
  开始 = event.getPoint();
 }
 @覆盖
 public void mouseReleased(MouseEvent 事件)
 {
  结束 = event.getPoint();
  画();
 }
 @覆盖
 公共无效鼠标拖动(鼠标事件e)
 {
  结束=e.getPoint();
  重绘();
 }
 @覆盖
 公共无效鼠标移动(鼠标事件 arg0){
  // TODO 自动生成的方法存根

 }
 @覆盖
 公共无效actionPerformed(ActionEvent e)
 {
  如果(e.getSource()==椭圆)
   选择=“椭圆”;
  如果(例如getSource()==线)
   选定="行";
  画();

 }
}

我需要创建一个绘画应用程序。当我通过从左到右拖动鼠标来绘制椭圆时,它什么也不显示。为什么?我应该在这里使用任何其他功能吗?

4

1 回答 1

8

当您向下和向右拖动鼠标时,您的程序会绘制一个椭圆。它向上和/或向左拖动不起作用,因为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会令人困惑(尽管它确实有效。)我会改为定义一个枚举。

于 2010-03-25T10:23:25.787 回答