按下按钮时出现复选框,java

checkbox appears when button pressed, java

我的代码显示了一个纹理,您可以在其中键入内容,并且它应该显示在带有复选框的标签下方。我想要的是只有通过文本字段设置标题时复选框才会出现。我找不到关于这个主题的任何内容 cb.validate();但这并没有真正帮助我。我也试过 this.add(cb);当按下按钮 ks 但它也不起作用。

public class ToDoPage extends JFrame implements ActionListener {
    
    int height = 300 ;
    int width = 450;
    JTextField tf = new JTextField("Tip here");
    JLabel l1 = new JLabel();
    JLabel l2 = new JLabel("");
    JLabel l3 = new JLabel("");
    JLabel l4 = new JLabel("");
    JLabel l5 = new JLabel("");
    
    JCheckBox cb = new JCheckBox();
    
    JLabel l = new JLabel("Daily Goals");
    JButton b = new JButton();
    Date date = new Date();
    
    
    
    public ToDoPage() {
        
    
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(height, width); //NICHT HARDCODEN
        this.setLayout(null);
        this.setLocationRelativeTo(null);
        this.setResizable(false);

        
        
        SimpleDateFormat DateFor = new SimpleDateFormat("dd MMMM yyyy");
        String stringDate = DateFor.format(date);
        
        tf.setBounds(50, 130, 170, 25);
        
        cb.setBounds(60, 150, 260, 40);
        
        l3.setBounds(60, 180, 260, 40);
        
        l4.setBounds(60, 210, 260, 40);
        
        l5.setBounds(60, 240, 260, 40);
        
        l1.setText("Today is: " + stringDate);
        l1.setBounds(70, 10, 300, 40);
        
        l.setBounds(87, 90, 260, 40);
        l.setFont(new Font(null, Font.ITALIC, 20));
        
        b.setBounds(230, 130, 25, 25);
        b.addActionListener(this);
        
        
        this.add(tf);
        this.add(l2);
        this.add(b);
        this.add(l);
        this.add(l1);
        this.add(l3);
        this.add(l4);
        this.add(l5);
        
        this.setVisible(true);
        
    }
    
        @Override
        public void actionPerformed(ActionEvent e) {
        
            if(e.getSource() == b) {
                String userInput = tf.getText();
                cb.setText(userInput);
                this.add(cb);
            }
        }
    }
}

简答

Swing 是懒惰的,它不会自动更新 UI,当你可以更新时,相反,当你完成时,你需要触发一个新的布局和绘制通道。

添加...

getContentPane().revalidate();
getContentPane().repaint();

this.add(cb);

之后

长答案

不要从 JFrame 扩展,您不会向 class 添加任何新功能,您只是将自己锁定在一个用例中。

避免 null 布局,它们对您没有帮助。相反,花时间了解如何使用提供的布局管理 API。参见 Laying Out Components Within a Container

如果您打算生成一个值列表,那么您应该考虑使用 JTableJList

有关详细信息,请参阅 How to Use Tables and How to Use Lists