JPanel(null)不显示JLabel

时间:2017-05-04 01:16:22

标签: java swing

我正在将Arraylist中的JLabel添加到JPanel中,只有我在面板上设置了布局才会显示,但我想在尝试panel = new JPanel(null);时自己设置标签的位置所有标签都不会显示

框:

public static void Frame(){
        panel = new JPanel(null);
        JFrame frame = new JFrame("New");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.pack();
        frame.setSize(400,400);
        frame.add(panel);
}

向面板添加标签的ArrayList迭代

private static void printArray() {
        for(int i = 0; i < food.size(); i++){
            component = new JLabel(new Food(food.get(i).getColor(), 
            food.get(i).getIconHeight(), food.get(i).getIconWidth(), 
            food.get(i).getLocationX(), food.get(i).getLocationY()));
            panel.add(component);
            component.setLocation(food.get(i).getLocationX(), 
            food.get(i).getLocationY());
        }
} 

我可以从Debug看到它肯定是获取位置信息,所以为什么不把它放在这个位置。

enter image description here

1 个答案:

答案 0 :(得分:1)

  

将布局设置为null的原因是我可以更新标签的位置,这样我就可以用键盘输入“移动”它

您需要做的第一件事是了解布局管理器实际执行的工作,因为如果您要删除它,您将需要接管它的工作。

布局管理器负责确定组件的大小和位置。他们通过各种方式实现这一目标,但可以使用组件的getPreferred/Minimum/MaximumSize方法。

因此,这表明您需要对这些值做出自己的决定,例如......

component = new JLabel(new Food(food.get(i).getColor(), 
        food.get(i).getIconHeight(), food.get(i).getIconWidth(), 
        food.get(i).getLocationX(), food.get(i).getLocationY()));
component.setSize(component.getPreferredSize());
component.setLocation(food.get(i).getLocationX(), food.get(i).getLocationY());

我还建议使用Key Bindings而不是KeyListener,它不会受到与焦点相关的问题的影响