标签的setLocation

我让所有标签都正常工作但userLabel [3]无法正确定位无论我做什么,标签“颜色:”始终显示在x坐标为0且y坐标为0的框架上在框架的一半。

JLabel[] userLabel = new JLabel[4]; for(int p = 0; p < userLabel.length; p++){ userLabel[p] = new JLabel(); userLabel[p].setSize(100,50); frameSetUp.add(userLabel[p]); } userLabel[0].setText("Width of Frame:"); userLabel[1].setText("Height of Frame:"); userLabel[2].setText("# OF Balls:"); userLabel[3].setText("Color:"); userLabel[0].setLocation(10,35); userLabel[1].setLocation(10,85); userLabel[2].setLocation(10,135); userLabel[3].setLocation(0,0); //no matter what coordinates I change this too, it wont reposition 

图片:[IMG] http://sofzh.miximages.com/java/23jfo9l.png [/ IMG] http://sofzh.miximages.com/java/23jfo9l.png

  1. 不要使用setLocation,setBounds,null布局或绝对定位。
  2. 而是使用布局管理器,包括可能嵌套的JPanel,每个都使用自己的布局管理器来实现令人满意的易维护GUI。
  3. 如需更多帮助,请展示您正在尝试实现的目标,实际实现的目标,并发布最小的工作示例 ,代码小,编译和运行,并向我们展示您的问题。

例如,

 import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.HashMap; import java.util.Map; import javax.swing.*; @SuppressWarnings("serial") public class InputForm extends JPanel { private static final int COLUMNS = 10; private static final int GAP = 3; private static final Insets LABEL_INSETS = new Insets(GAP, GAP, GAP, 15); private static final Insets TEXTFIELD_INSETS = new Insets(GAP, GAP, GAP, GAP); private String[] labelTexts; private Map fieldMap = new HashMap(); public InputForm(String[] labelTexts) { this.labelTexts = labelTexts; setLayout(new GridBagLayout()); for (int i = 0; i < labelTexts.length; i++) { String text = labelTexts[i]; JTextField field = new JTextField(COLUMNS); fieldMap.put(text, field); addLabel(text, i); addTextField(field, i); } } public String[] getLabelTexts() { return labelTexts; } private void addTextField(JTextField field, int row) { GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = 1; gbc.gridheight = 1; gbc.gridx = 1; gbc.gridy = row; gbc.anchor = GridBagConstraints.EAST; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = TEXTFIELD_INSETS; gbc.weightx = 1.0; gbc.weighty = 1.0; add(field, gbc); } private void addLabel(String text, int row) { GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = 1; gbc.gridheight = 1; gbc.gridx = 0; gbc.gridy = row; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.BOTH; gbc.insets = LABEL_INSETS; gbc.weightx = 1.0; gbc.weighty = 1.0; add(new JLabel(text), gbc); } public String getFieldText(String key) { String text = ""; JTextField field = fieldMap.get(key); if (field != null) { text = field.getText(); } return text; } private static void createAndShowGui() { String[] labelTexts = new String[] { "Width of Frame:", "Height of Frame:", "# OF Balls:", "Color:" }; InputForm inputForm = new InputForm(labelTexts); int result = JOptionPane.showConfirmDialog(null, inputForm, "Input Form", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); if (result == JOptionPane.OK_OPTION) { for (String text : labelTexts) { System.out.printf("%20s %s%n", text, inputForm.getFieldText(text)); } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 

这将显示如下:

在此处输入图像描述

这段代码的美妙之处在于,如果你想添加另一个字段,比如一个行厚度字段,并希望添加它以使其倒数第二,那么代码所需的唯一更改就是更改它:

  String[] labelTexts = new String[] { "Width of Frame:", "Height of Frame:", "# OF Balls:", "Color:" }; 

对此:

  String[] labelTexts = new String[] { "Width of Frame:", "Height of Frame:", "# OF Balls:", "Line Thickness:", "Color:" }; 

结果如下:

在此处输入图像描述

无需计算如何更改Color标签或JTextField的位置,因为布局管理器会为您完成所有艰苦的工作。

最后得到答案尝试将JLabel数组的大小增加1并运行它将正常工作

 import javax.swing.JFrame; import javax.swing.JLabel; public class Labelss{ public static void main(String[] args) { JFrame frame = new JFrame(); frame.setBounds(50, 50, 700, 550); JLabel[] userLabel = new JLabel[6]; for(int p = 0; p < userLabel.length; p++){ userLabel[p] = new JLabel(); } userLabel[0].setBounds(10,35,100,50); userLabel[1].setBounds(10,85,100,50); userLabel[2].setBounds(10,135,100,50); userLabel[3].setBounds(10,185,100,50); userLabel[4].setBounds(10,235,100,50); userLabel[0].setText("Width of Frame:"); userLabel[1].setText("Height of Frame:"); userLabel[2].setText("# OF Balls:"); userLabel[3].setText("Color:"); userLabel[4].setText("Stack overflow:"); for(int p = 0; p < userLabel.length; p++){ frame.add(userLabel[p]); } frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }