【问题标题】:Adding shapes to JPanel on a button click单击按钮将形状添加到 JPanel
【发布时间】:2014-11-01 17:28:20
【问题描述】:

我有一个带按钮的 Class Circle 和一个带 jPanel 的 Class 我想要做的是,当单击该按钮时,将在面板上绘制一个圆圈,每次单击该按钮并更改 x 和 y “一些怎么不在这里实现”我一遍又一遍地在 JPanel 上画了一个圆圈。 如何做到这一点,或者有没有办法做我所描述的事情,不管我的代码如何,但我希望类 circle 扩展 Shape。

public class Window{

  private JFrame frame;
  private JPanel panel = new JPanel();
  Circle c = new Circle(frame, panel);
  // some other buttons 
  .
  .
 // some code to set the panel grid bag constaraints and background then
 frame.getContentPane().add(panel, gbc_panel);
}

然后是 Circle 类

public class Circle extends Shape implements ActionListener{

  private JPanel Panel;
  private GridBagConstraints gbc_btnCircle;
  private JButton btnCircle;

  public void setPanel(JPanel panel) {
      Panel = panel;
  }

 public Circle(JFrame frame, JPanel panel){
    btnCircle = new JButton("Circle");
    // some code to set grid bag constraint then
    frame.getContentPane().add(btnCircle, gbc_btnCircle);
    setPanel(panel);        
    btnCircle.addActionListener(this);

 }

  public void paint(Graphics g) {
      super.paintComponents(g);
      g.setColor(Color.red);        
      g.fillOval(100, 100, 100, 100);     
      Panel.add(this);
  }

  public void actionPerformed(ActionEvent arg0) {
    repaint();      
  }
}

【问题讨论】:

    标签: java swing paint


    【解决方案1】:

    你的想法有点不对。在您的绘图面板中,您应该有一个List<Circle>。而在绘图面板的paintComponent方法中,你应该遍历列表来绘制每个圆圈

    class Circle {
        int x, int y, int width, int height;
        public Circle (int x, int y, int width, int height) {
            ... set em
        }
        public void draw(Graphics g) {
            g.fillOval(x, y, width, height);
        }
    }
    class DrawingPanel extends JPanel {
        List<Circle> circles = new ArrayList<>();
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (Circle circle : circles) {
                circle.draw(g);
            }
        }
    
        // Dont forget to override public Dimension getPreferredSize()
    }
    

    要向列表中添加更多圈子,只需在 DrawingPanel 类中添加一个 addCircle 方法

    public void addCircle(Circle circle) {
        circles.add(circle);
        repaint();
    }
    

    就按钮而言,您应该在Window 类中创建它。在ActionListener 中,只需创建一个new Circle 并通过调用addCircle 方法将其添加到DrawingPanel


    另外,Circle 不需要扩展 ShapeShape API 已经有一个 Ellipse2D 类,您可以从中创建圈子

    class DrawingPanel extends JPanel {
        List<Ellipse2D> circles = new ArrayList<>();
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g.create();
            for (Ellipse2D circle : circles) {
                g2.fill(circle);
            }
            g2.dispose();
        }
        // Dont forget to override public Dimension getPreferredSize()
    }
    

    更新:完整示例

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class CirclesDemo {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    new CirclesDemo();
                }
            });
        }
    
        public CirclesDemo() {
            JFrame frame = new JFrame();
            frame.add(panel);
            frame.add(createButton(), BorderLayout.PAGE_END);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        private final DrawingPanel panel = new DrawingPanel();
    
        private JButton createButton() {
            JButton button = new JButton("Add Circle");
            button.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    int[] circleValues = generateRandomValues(300, 300, 50, 150);
                    int x = circleValues[0];
                    int y = circleValues[1];
                    int width = circleValues[2];
                    int height = width;
                    Circle circle = new Circle(x, y, width, height);
                    panel.addCircle(circle);
                }
            });
            return button;
        }
    
        private int[] generateRandomValues(int maxX, int maxY, 
                                           int minSize, int maxSize) {
            Random random = new Random();
            int[] values = new int[3];
            values[0] = random.nextInt(maxX);
            values[1] = random.nextInt(maxY);
            values[2] = Math.min(random.nextInt(maxSize) + minSize, maxSize);
            return values;
        }
    
        class Circle {
    
            int x, y, width, height;
    
            public Circle(int x, int y, int width, int height) {
                this.x = x;
                this.y = y;
                this.width = width;
                this.height = height;
            }
    
            public void draw(Graphics g) {
                g.drawOval(x, y, width, height);
            }
        }
    
        class DrawingPanel extends JPanel {
    
            List<Circle> circles = new ArrayList<>();
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                for (Circle circle : circles) {
                    circle.draw(g);
                }
            }
    
            public void addCircle(Circle circle) {
                circles.add(circle);
                repaint();
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
        }
    }
    

    【讨论】:

    • 请你看看添加编辑,直到我为什么我仍然不工作?当我点击按钮时,我的面板上什么也没有。
    • 1) 我看不到按钮的创建位置以及您添加ActionListener 的位置。我将假设完全放弃了第一个 Circle 类 2) 你是否覆盖了getPreferredSize? 3) 我没有看到你将DrawingPanel 添加到框架中。
    【解决方案2】:

    您正在覆盖 Circle 的绘制方法。您需要覆盖面板的绘制方法。

    【讨论】:

    • 请问该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多