如何将 JLabel 添加到 JPanel

How to add JLabel to JPanel

public void mouseClicked(MouseEvent e){
        JLabel label = ((JLabel)e.getSource());
        //searches for the label in the label arrayList 
        for(int i = 0; i < labels.size(); i++)
            if(labels.get(i) == label){
                JLabel newLabel = new JLabel();
                newLabel.setIcon(label.getIcon());
                newLabel.addMouseMotionListener(motionListener);
                modelPanel.add(newLabel);
                newLabel.setLocation(150, 160);
                newLabel.setVisible(true);
                modelPanel.revalidate();
                modelPanel.repaint();
                System.out.println("added" +modelPanel.getX()+ " " + modelPanel.getY());
                System.out.println(newLabel.getX() + " " + newLabel.getY());
            return;
            }                       
    }

上面的代码应该创建一个新的 JLabel 并将其添加到 JPanel modelPanel。 System.out.println 显示对象已添加,但在运行时无法在屏幕上显示。

modelPanel 没有布局管理器,因为我正在构建一个允许用户将创建的标签拖放到 modelPanel 的任何部分的应用程序。

如何让 JLabel 显示在模型面板上?

使用 null LayoutManager 意味着您需要完成缺少的 LayoutManager 的工作,这包括设置 location 和子组件的 size (后者未在您的代码中完成)。将 JLabel 动态添加到空布局 JPanel 的一个非常简单的示例:

JFrame frame = new JFrame();
final JPanel panel = new JPanel();
panel.setLayout(null);
final int size = 400;
javax.swing.Timer timer = new javax.swing.Timer(500, new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
        JLabel lab = new JLabel("HERE");
        lab.setLocation((int)(size * Math.random()), (int)(size * Math.random()));
        lab.setSize(new Dimension(40,20));
        panel.add(lab);
        panel.repaint();
    }
});

frame.add(panel);
frame.setSize(size, size);
frame.setVisible(true);
timer.start();