通过单击JButton动态添加组件到JPanel

时间:2018-04-10 11:20:51

标签: java swing dynamic custom-component

这是我的块类:

public class Block extends JComponent {
    public int width, height;
    public Color colour;

    public Block( int width, int height, Color colour) {
        super();
        setSize(new Dimension(width, height));
        setPreferredSize(new Dimension(width, height));
        setBackground(colour);
        this.width = width;
        this.height = height;
        this.colour = colour;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(colour);
        g.fillRect(0, 0, width, height);
    }
}

我的球类:

public class Ball extends JComponent {
    public int width, height;
    public Color colour;

    public Ball(int width, int height, Color colour) {
        super();
        setSize(new Dimension(width, height));
        setPreferredSize(new Dimension(width, height));
        setBackground(colour);
        this.width = width;
        this.height = height;
        this.colour = colour;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(colour);
        g.fillOval(0, 0, width, height);
    }
}

这是我的主要课程:

public class Main extends JPanel {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setContentPane(new Main());
        frame.setSize(new Dimension(1000, 1000));
        frame.setPreferredSize(new Dimension(1000, 1000));
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public Main() {
        JComboBox<String> shapes = new JComboBox(new String[]{"Square", "Oval"});

        JSpinner width = new JSpinner();
        SpinnerNumberModel widthModel = new SpinnerNumberModel();
        widthModel.setMinimum(1);
        widthModel.setMaximum(200);
        width.setModel(widthModel);

        JSpinner height = new JSpinner();
        SpinnerNumberModel heightModel = new SpinnerNumberModel();
        heightModel.setMinimum(1);
        heightModel.setMaximum(200);
        height.setModel(heightModel);

        JButton submit = new JButton("Add Shape");
        submit.addActionListener((ActionEvent e) -> {
            if (shapes.getSelectedItem().equals("Square")) {
                add(new Block((Integer)widthModel.getValue(), (Integer)heightModel.getValue(), Color.BLUE));
            } else {
                add(new Ball((Integer)widthModel.getValue(), (Integer)heightModel.getValue(), Color.BLUE));                
            }
        });

        add(shapes);
        add(width);
        add(height);
        add(submit);


    }
}

当您点击&#34;提交&#34;按钮,它应添加正方形或椭圆形(取决于您的选择),以及您在微调器中指定的高度和宽度。但是,它没有任何东西。我打印出宽度和高度,它们是有效的,所以没有问题。此外,我尝试自己添加自定义组件,并且工作正常。

2 个答案:

答案 0 :(得分:1)

你忘记了两件重要的事情:

  1. 您需要为getPreferredSize()Brick
  2. 定义方法Ball
  3. 您需要使用方法revalidate()repaint()
  4. 更新布局

    这是固定代码:

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerNumberModel;
    
    public class Main extends JPanel {
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setContentPane(new Main());
            frame.setSize(new Dimension(1000, 1000));
            frame.setPreferredSize(new Dimension(1000, 1000));
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        public Main() {
            JComboBox<String> shapes = new JComboBox(new String[] {"Square", "Oval"});
    
            JSpinner width = new JSpinner();
            SpinnerNumberModel widthModel = new SpinnerNumberModel();
            widthModel.setMinimum(1);
            widthModel.setMaximum(200);
            width.setModel(widthModel);
    
            JSpinner height = new JSpinner();
            SpinnerNumberModel heightModel = new SpinnerNumberModel();
            heightModel.setMinimum(1);
            heightModel.setMaximum(200);
            height.setModel(heightModel);
    
            JButton submit = new JButton("Add Shape");
            submit.addActionListener(e -> {
                if (shapes.getSelectedItem().equals("Square")) {
                    add(new Block((Integer) widthModel.getValue(), (Integer) heightModel.getValue(), Color.BLUE));
                } else {
                    add(new Ball((Integer) widthModel.getValue(), (Integer) heightModel.getValue(), Color.BLUE));
                }
                revalidate();
                repaint();
            });
    
            add(shapes);
            add(width);
            add(height);
            add(submit);
    
        }
    
        public static class Block extends JComponent {
            public int width, height;
    
            private final Dimension size;
    
            public Color colour;
    
            public Block(int width, int height, Color colour) {
                super();
                setSize(new Dimension(width, height));
                setPreferredSize(new Dimension(width, height));
                setBackground(colour);
                this.width = width;
                this.height = height;
                this.colour = colour;
                this.size = new Dimension(width, height);
            }
    
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(colour);
                g.fillRect(0, 0, width, height);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return size;
            }
        }
    
        public class Ball extends JComponent {
            public int width, height;
    
            private final Dimension size;
    
            public Color colour;
    
            public Ball(int width, int height, Color colour) {
                super();
                setSize(new Dimension(width, height));
                setPreferredSize(new Dimension(width, height));
                setBackground(colour);
                this.width = width;
                this.height = height;
                this.colour = colour;
                this.size = new Dimension(width, height);
            }
    
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(colour);
                g.fillOval(0, 0, width, height);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return size;
            }
        }
    }
    

答案 1 :(得分:1)

添加组件后调用repaint()方法。