2017-01-17 62 views
0

我想编写一个应用程序,让您用JFrame左侧的鼠标单击来绘制圆,并且所有点都在右侧“镜像”。我遇到的第一个问题是,当我尝试在我的框架中实现这个绘制机制时,没有出现圆圈。在JPanel的一边绘制

public class Application{ 
    int x,y; 
    private JPanel container; 

    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     new Application().gui(); 
     } 
    }); 
    } 

    public void gui() 
    { 
    int height = 250; 
    int width = 700; 
    JFrame jframe = new JFrame(); 
    container = new JPanel(); 
    container.setLayout(new BorderLayout()); 

    container.add(new DrawCircle(), BorderLayout.WEST); 
    container.setVisible(true); 
    jframe.add(container); 
    //jframe.add(new DrawCircle()); 

    jframe.setSize(500,700); 
    jframe.setVisible(true); 
    jframe.setTitle("Title"); 
    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jframe.setResizable(false); 

    } 
} 

它的工作原理(全帧)当我使用container.add(new DrawCircle)但如果我想补充的限制,它没有。

这里是圆类:

public class DrawCircle extends JPanel implements MouseListener 
{ 
    ArrayList<Point> p = new ArrayList<Point>(); 

    public DrawCircle() 
    { 
    addMouseListener(this); 
    } 

    public void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    for(Point point : p) 
    { 
     g.fillOval(point.x,point.y,30,30);  
    } 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
    // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
    // TODO Auto-generated method stub 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
    p.add(new Point(e.getY(), e.getX())); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
    } 

    @Override 
    public void mouseMoved(MouseEvent arg0) { 
    } 
} 
+1

一个相关的例子是审查[这里](http://stackoverflow.com/q/2244157/230513)。 – trashgod

+0

你为什么要删除'DrawCircle'代码? – Frakcool

回答

1

让我们通过你的问题:

我遇到的第一个问题是,当我尝试实现这个平局机械师在我的框架,没有圆圈出现。

这是因为你忘了打电话给JPanel#revalidate()JPanel#repaint()每当你在DrawCircle类点击某处。

所以,你可以改变你的mousePressed()方法:

@Override 
public void mousePressed(MouseEvent e) { 
    p.add(new Point(e.getX(), e.getY())); 
    revalidate(); 
    repaint(); 
} 

请注意,我也改变了e.getX()e.getY()电话,因为他们是在错误的地方(除非你想他们的方式)。

这将使你的圈子中出现,但是,你DrawCircle是真的瘦了(我改变了你的JFrame的高度,以200为这个图象,否则这将是非常高):

enter image description here

红色部分是您的DrawCircle面板。

要解决这个问题,你需要重写它的getPreferredSize()方法:

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(width, height); 
} 

那将使你JPanel返回一半大小,widthheight作为参数的构造函数是过去了,现在你的类DrawCircle应是这样的:

class DrawCircle extends JPanel implements MouseListener { 
    ArrayList<Point> p = new ArrayList<Point>(); 

    int width = 0; 
    int height = 0; 

    public DrawCircle(int width, int height) { 
     this.width = width; 
     this.height = height; 
     addMouseListener(this); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(width, height); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (Point point : p) { 
      g.fillOval(point.x, point.y, 30, 30); 
     } 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     p.add(new Point(e.getX(), e.getY())); 
     revalidate(); 
     repaint(); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 
} 

和输出会是这样的:

enter image description here

它的工作原理(全帧)当我使用container.add(新画圆)

,默认情况下是因为BorderLayout地方默认的CENTER区的元素,如果你在其余的方向(NORTHSOUTH等)中没有其他的东西,它将占据整个空间。

现在,让我们继续与如何解决你的问题:

我也做了一些改动Application类(这在我来说,我改名为CustomPaintingInHalfFrame):

这些变化是:

  • WIDTHHEIGHT属性创建最终常量。
  • 删除不必要的JPanelBorderLayout布局,因为JFrame默认情况下已经有了这个布局,我只是简单地加了我们的DrawClass它。
  • 图纸为DrawCircle面板边框的(因为你不想和你JFrame右)两部分之间的分工(左为在规定的previous question你可以简单地将其删除(我建议你离开它而存在您正在测试,所以你知道在哪里左图结束,右侧面板开始。
  • 传递WIDTH/2HEIGHT作为参数DrawCircle构造,所以可以返回正确的Dimension

所以,我们班现在应该看像这样:

public class CustomPaintingInHalfFrame { 
    int x, y; 
    public static final int WIDTH = 500; 
    public static final int HEIGHT = 200; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new CustomPaintingInHalfFrame().gui(); 
      } 
     }); 
    } 

    @SuppressWarnings("serial") 
    public void gui() { 
     JFrame jframe = new JFrame("Title"); 

     DrawCircle dc = new DrawCircle(WIDTH/2, HEIGHT); 

     dc.setBorder(BorderFactory.createLineBorder(Color.RED)); 

     jframe.add(dc, BorderLayout.WEST); 

     jframe.setSize(WIDTH, HEIGHT); 
     jframe.setVisible(true); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setResizable(false); 

    } 
} 

其他提示

  1. 我建议您重新命名DrawCircleCircle或类似的东西。作为convention名应该是名词

  2. 重命名gui()方法createGui()例如因为,如类名称,方法名称应该是动词