2017-05-04 110 views
0

我将Arraylist中的JLabel添加到JPanel,它们只会在面板上设置布局时显示,但我想设置标签的位置,我尝试使用panel = new JPanel(null);所有标签不显示。JPanel(null)不显示JLabels

框架:

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

我可以从调试看到它绝对是在获取定位信息,那么,为什么不把它放在这个位置。

enter image description here

+1

猜猜“布局管理器”做了什么工作?猜猜将它设置为null时会发生什么 – MadProgrammer

+1

*“我将Arraylist中的JLabel添加到JPanel,并且只有当我设置布局时才会显示*” - 这是正确的,*“但我想设置位置我自己的标签“* - 嗯,首先,我会问为什么?你想做什么,可用的布局管理员不能做什么? – MadProgrammer

+0

@MadProgrammer hey mate im遵循以下代码http://www.camick.com/java/source/MotionWithKeyListener.java,看起来好像他做了同样的事情,它的工作正常,他的代码。将layout设置为null的原因是我可以更新标签的位置,这样我就可以用键盘输入“移动”它,并且在这个文档中他们还建议将它设置为null https://docs.oracle.com/ javase/tutorial/uiswing/layout/none.html Ps热爱你的工作。 – Ross

回答

1

之所以要设置布局空的,所以我可以更新标签的位置,所以我可以用键盘输入

你需要的第一件事情围绕着“移动”它要做的是理解布局经理实际上做了什么工作,因为如果你要删除它,你将需要接管它的工作。

布局管理器负责确定组件的大小和位置。他们通过各种方式做到这一点,但可以利用组件的方法。

所以这会建议你需要让你自己决定这些值,例如...

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 BindingsKeyListener,它不会从同患重点相关问题