【问题标题】:Dynamically Adding Components to JPanel on click of JButton单击 JButton 将组件动态添加到 JPanel
【发布时间】:2018-09-19 23:55:27
【问题描述】:

这是我的块类:

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


    }
}

当您单击“提交”按钮时,它应该添加一个正方形或椭圆形(取决于您的选择),其高度和宽度由您在微调器中指定。然而,它什么都没有。我打印出宽度和高度,它们是有效的,所以没有问题。另外,我尝试自己添加自定义组件,效果很好。

【问题讨论】:

    标签: java swing dynamic custom-component


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      这里是固定代码:

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

      【讨论】:

        猜你喜欢
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 2013-05-04
        • 1970-01-01
        • 2012-12-10
        • 1970-01-01
        相关资源
        最近更新 更多