How to Draw some shape on JPanel using ActionListener?

后端 未结 2 954
清酒与你
清酒与你 2020-12-12 06:35

I\'m practising to draw a shape on a JPanel by clicking on a Jbutton, but I cannot. It\'s been five hours that I\'m surfing the web, but I cannot find the way to do it. Thi

2条回答
  •  没有蜡笔的小新
    2020-12-12 07:12

    Here is a derived example from your code.

    As @MadProgrammer said, don't extend JFrame.

    In the following example, here are the major changes :

    • give a non-null value to botSelected, or the first calls to paintComponent will give you a NullPointerException

    • the class now extends JPanel, and overrides paintComponent for custom painting

    • the ActionListener is an anonymous class, because you don't need a separate class, and it has direct access to the fields from Shape

    • botSelected is no longer static (see above point)

    .

    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    class Shape extends JPanel {
        JButton rec, circle;
        String botSelected = "";// don't let it be null, it would make paintComponent crash on startup
    
        Shape() {
            frameSet();
        }
    
        void frameSet() {
            JFrame frame = new JFrame();
            frame.setVisible(true);
            frame.setSize(600, 300);
            rec = new JButton("Rectangle");
            circle = new JButton("Circle");
    
            frame.add(this);
            this.add(rec);
            this.add(circle);
            // anonymous class, has access to fields from the outer class Shape
            ActionListener clk = new ActionListener() {
                public void actionPerformed(final ActionEvent e) {
                    botSelected = e.getActionCommand();
                    repaint();
                }
    
            };
            rec.addActionListener(clk);
            circle.addActionListener(clk);
        }
    
        //custom painting of the JPanel
        @Override
        public void paintComponent(final Graphics g) {
    
            super.paintComponent(g);
            if (botSelected.equals("Rectangle")) {
                g.fillRect(50, 50, 50, 50);
            } else if (botSelected.equals("Circle")) {
                g.fillOval(50, 50, 50, 50);
            }
        }
    
        public static void main(final String[] arg) {
            Shape s = new Shape();
        }
    
    }
    

提交回复
热议问题