2013-12-13 30 views
0

我需要将JLabel对象添加到面板的特定组件。我使用setLabelFor方法,但是这个将标签nex添加到组件。如何将其更改为在组件顶部设置标签?将JLabel放在组件上面

TextField sampleField = new TextField(); 
JLabel sampleLabel = new JLabel("sample text"); 
panel.add(sampleField); 
sampleLabel.setLabelFor(sampleField); 
panel.add(sampleLabel); 

^这个将sampleLabel放在sampleField的旁边。如何把sampleLabel放在sampleField的顶部?

预先感谢。

@Edit:

我用的是这样的:

public TabBody() 
{ 
    setLayout(new BorderLayout()); 
    nameField = new TextField(); 
    //nameField.setSize(new Dimension(200, 200)); 
    //revalidate(); 
    nameLabel = new JLabel("name test"); 
    amountLabel = new JLabel("amount test"); 
    amountField = new TextField(); 
    unitsBox = new JComboBox(units); 
    unitsBox.setSelectedIndex(3); 

    nameLabel.setLabelFor(nameField); 
    amountLabel.setLabelFor(amountField); 
    add(nameLabel, BorderLayout.NORTH); 
    add(amountLabel, BorderLayout.NORTH); 

    add(nameField); 
    add(amountField); 
    add(unitsBox); 
} 

和结果是:

enter image description here

我需要这样的:

enter image description here

+1

这是由LayoutManager控制的,为了更好地帮助更早地发布SSCCE – mKorbel

+0

请参阅[JLayeredPane教程](http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html)了解一些想法 –

回答

1

JPanel使用FlowLayout默认情况下,这个地方组件一一一排。因为你有这种效果。

您需要使用例如适当LayoutManager使用BorderLayout

import java.awt.BorderLayout; 
import java.awt.TextField; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Example { 

    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 

     JPanel panel = new JPanel(new BorderLayout()); 
     TextField sampleField = new TextField(); 
     JLabel sampleLabel = new JLabel("sample text"); 
     panel.add(sampleField); 
     sampleLabel.setLabelFor(sampleField); 
     panel.add(sampleLabel,BorderLayout.NORTH); 

     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 

enter image description here

如果你需要一个放置组件在网格中,一个例如尝试使用GridBagLayout

JPanel panel = new JPanel(new GridBagLayout()); 
    JTextField sampleField = new JTextField(5); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.anchor = GridBagConstraints.WEST; 
    c.gridx = 0; 
    c.gridy = 0; 
    c.insets = new Insets(5, 5, 5, 5); 

    JLabel sampleLabel = new JLabel("sample text"); 
    panel.add(sampleLabel,c); 

    c.gridy++; 
    panel.add(sampleField,c); 

    c.gridy++; 
    panel.add(new JLabel("sample text 2"),c); 

    c.gridy++; 
    panel.add(new JTextField(5),c); 

    c.gridy++; 
    panel.add(new JTextField(5),c); 

管理职位与gridxgridy本身领带GridBagConstraints

enter image description here

0

您必须使用布局来安排您的组件。对于JPanel deafult,它是FlowLayout,它将您的组件排列在一起。您可以使用GridLayoutGridBagLayout

下面是示例代码:

TextField sampleField = new TextField(); 
JLabel sampleLabel = new JLabel("sample text"); 
panel.setLayout(new GridBagLayout()); 
sampleLabel.setLabelFor(sampleField); 
GridBagConstraints = new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0); 
panel.add(sampleLabel, gbc); 
gbc.gridY=1; 
panel.add(sampleField, gbc); 
+0

当我将GridLayout设置为2行(根据需要)时,它会在这两行中随机标签nad组件,但我需要将标签放在第一行,其他组件放在第二行。怎么做? – mlethys

+0

你想要第一行的文字和第二行的文字? – Aditya

+0

我需要像alex2410发布的东西,但它适用于面板包含一个标签和一个其他组件。例如,当我放置3个组件和2个标签来描述前2个组件时,它根本不起作用。 – mlethys

相关问题