Java - 单击按钮后用鼠标绘制形状并拖动

时间:2016-02-20 15:50:21

标签: java swing user-interface button mouselistener

我想在不使用JComponent的情况下这样做。我们的想法是为每个形状设置多个按钮,通过单击按钮,我可以绘制该按钮的形状。不幸的是,我现在甚至无法画出形状。

public static void main(String[] args) {
    JFrame frame = new JFrame();
    JButton rect = new JButton("Rectangle");
    ActionListener rListener = new RectangleNode();
    rect.addActionListener(rListener);
    MouseListener rMListener = new RectangleNode();
    rect.addMouseListener(rMListener);
    MouseMotionListener rMMListener = new RectangleNode();
    rect.addMouseMotionListener(rMMListener);
    JButton ellipse = new JButton("Ellipse");
    JPanel panel = new JPanel();
    panel.add(rect);
    panel.add(ellipse);
    frame.add(panel);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600, 600);
    frame.setTitle("Graph Draw");
    frame.setVisible(true);
}

RectangleNode类

public class RectangleNode implements ActionListener,MouseListener,MouseMotionListener {
    private Point p1;
    private Rectangle r;
    private boolean rdraw;

    @Override
    public void actionPerformed(ActionEvent e) {
        rdraw = true;   
    }

    @Override
    public void mousePressed(MouseEvent e) {
        if(rdraw = true){
            p1 = e.getPoint();
            r = new Rectangle(p1.x, p1.y, p1.x - p1.x, p1.y - p1.y);
        }
    }

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

    }

    @Override
    public void mouseDragged(MouseEvent e) {
        if(rdraw = true){
            int x = Math.min(p1.x, e.getX());
            int y = Math.min(p1.y, e.getY());
            int width = Math.abs(p1.x - e.getX());
            int height = Math.abs(p1.y - e.getY());
            r.setBounds(x, y, width, height);
            repaint();
        }
    }

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

    }

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

    }

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

    }

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

    }
    public void paintComponent(Graphics g) {  
        Graphics2D g2 = (Graphics2D)g;
        g2.draw(r); ;
    }
}

我不确定如何在这种情况下使用重绘和paintComponent方法。

1 个答案:

答案 0 :(得分:3)

查看Custom Painting Approaches以获取有关如何动态绘制矩形的示例。

在您的情况下,您希望能够绘制矩形或椭圆,因此您需要进行一些更改:

  1. Java API支持Shape类。 Shape可以是Rectangle,Ellipse,Polygon等。因此,您需要将“ColoredRectangle”类更改为“ColoredShape”类。这将允许您存储矩形或椭圆。

  2. 然后在paintComponent()代码中,您需要将drawRect(..)方法更改为绘图(Shape),以便可以绘制矩形和椭圆。

  3. 在mouseDragged()逻辑中,您需要修改逻辑以检查是否要绘制Rectangle或Ellispse。然后你将创建适当的Shape并再次使用draw(Shape)方法而不是drawRect(...)方法。

  4. 然后,您需要在类中添加一个属性来控制要绘制的Shape。然后单击按钮设置属性。或者也许不是使用按钮为每个Shape设置单选按钮。

  5. 无论如何,使用原始代码来了解它是如何工作的。首先,将代码转换为仅使用Rectangle的ColoredShape类。然后,一旦有效,您可以添加对Ellipse的支持。