【问题标题】:JLabel not appearing in JPanelJLabel 未出现在 JPanel 中
【发布时间】:2018-05-18 01:25:42
【问题描述】:

我用 JTextField、JPanel 和一个用户输入值的按钮制作了一个 JFrame,单击该按钮后,它将根据用户输入生成多个标签,但 JLabel 没有出现 .我做错了吗?

这是按钮的编码。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String s = jTextField1.getText();
    int noSub = Integer.valueOf(s);
    addData(noSub);
} 

这是添加JLabel的方法。

public void addData(int a){
    jPanel1.removeAll();
    int num = a;
    JLabel jLabel[] = new JLabel[num];

    for(int i=0;i<num;i++){
        jLabel[i]=new JLabel();
        jLabel[i] = new JLabel("Label "+i);
        jPanel1.add(jLabel[i]);
        jPanel1.revalidate();
        jPanel1.repaint();
    }
    jPanel1.updateUI();
}

【问题讨论】:

  • jPanel1.updateUI(); 没有按照您的想法进行操作。您在JPanel 上使用什么布局管理器?我打赌这是null 或“绝对”布局(甚至是GroupLayout
  • @MadProgrammer 是的,它为空。我应该改变什么?
  • @DanialWafiy 这将取决于您想要的结果
  • @MadProgrammer 显示它怎么样?只要它在那里就很好

标签: java swing jframe jpanel jlabel


【解决方案1】:

在这里做了一个简单的工作示例:

public class Sample extends JFrame{
    private JTextField inputField;
    private JPanel outputPanel;

    private Sample() {
        JPanel mainPanel = new JPanel(new BorderLayout());
        JPanel form = new JPanel(new GridBagLayout());
        inputField = new JTextField(3);
        JButton submitBtn = new JButton("Enter");
        form.add(inputField);
        form.add(submitBtn);
        mainPanel.add(form, BorderLayout.NORTH);
        outputPanel = new JPanel();
        mainPanel.add(outputPanel);
        submitBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String text = inputField.getText();
                int noSub = Integer.valueOf(text);
                addData(noSub);
            }

            void addData(int data){
                outputPanel.removeAll();
                JLabel jLabel[] = new JLabel[data];

                for(int i=0;i<data;i++){
                    jLabel[i] = new JLabel("Label "+i);
                    outputPanel.add(jLabel[i]);
                }
                outputPanel.revalidate();
                outputPanel.repaint();
                // No need to call outputPanel.updateUI()
            }
        });
        setSize(400,500);
        add(mainPanel);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new Sample();
    }
}

【讨论】:

  • 我会将revalidaterepaint 语句移到for-loop 之外,它们是昂贵的调用,最好用作批量更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 2018-01-20
相关资源
最近更新 更多