【问题标题】:Java - Drawing shape with mouse and drag after clicking buttonJava - 单击按钮后用鼠标绘制形状并拖动
【发布时间】:2016-06-02 05:10:54
【问题描述】:

我想在不使用 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);
}

矩形节点类

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); ;
    }
}

我不知道在这种情况下如何使用 repaint,以及 paintComponent 方法。

【问题讨论】:

  • "...without the use of the JComponent" -- 并且不使用 JPanel?
  • 您似乎正在将 MouseListener 添加到 JButton 以用于绘图目的,这很抱歉,但没有任何意义。您需要做的是创建一个扩展 JPanel 的绘图类,并将您的 MouseListener 和 MouseMotionListener 添加到其中,就像任何教程一样,本网站上的许多示例都会向您展示。如果没有有关您的人为约束的更多信息,我不知道如何为您提供帮助。请向我们提供有关此限制和您的问题的更多信息。
  • "I'm not sure how to use repaint, and the paintComponent method in this situation" -- 不扩展 JPanel 或 JComponent,你根本做不到。

标签: java swing user-interface button mouselistener


【解决方案1】:

查看Custom Painting Approaches 了解如何动态绘制矩形的示例。

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

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

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

  3. 在 mouseDragged() 逻辑中,您需要修改逻辑以检查是否要绘制矩形或椭圆形。然后,您将创建正确的 Shape 并再次使用 draw(Shape) 方法而不是 drawRect(...) 方法。

  4. 然后您需要向该类添加一个属性来控制您要绘制的形状。然后,当您单击按钮时,您将设置属性。或者,您可以为每个形状设置单选按钮,而不是使用按钮。

无论如何,请使用原始代码以了解其工作原理。首先将代码转换为仅对矩形使用 ColoredShape 类。然后,一旦成功,您就可以添加对 Ellipse 的支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多