Java 将JLabel放置在彼此下方

Java 将JLabel放置在彼此下方,java,swing,jpanel,jlabel,Java,Swing,Jpanel,Jlabel,我正在为我的应用程序创建一个脚本编辑器。目前,我在一个JPanel中显示了行号,其中包含由JLabels表示的内容。但是,当我添加新的JLabel来表示新的行号时,JLabel显示在面板的中心,即使我设置JLabel的setVerticalAlignment和setVerticalTextPosition时也是如此。我想要它,这样标签就会出现在彼此下面 包含所有JLabel的JPanel类构造函数: public LineNumberPanel() { setPreferredSize

我正在为我的应用程序创建一个脚本编辑器。目前,我在一个JPanel中显示了行号,其中包含由JLabels表示的内容。但是,当我添加新的
JLabel
来表示新的行号时,
JLabel
显示在面板的中心,即使我设置
JLabel的
setVerticalAlignment
setVerticalTextPosition
时也是如此。我想要它,这样标签就会出现在彼此下面

包含所有JLabel的JPanel类构造函数:

public LineNumberPanel() {

    setPreferredSize(new Dimension(width, height));
    setLayout(new GridLayout(0, 1));

    //setup the label
    label = new JLabel(String.valueOf(lineCount));
    label.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 15));

    //setup the label alignment
    label.setVerticalAlignment(JLabel.TOP);
    label.setHorizontalAlignment(JLabel.CENTER);
    label.setVerticalTextPosition(JLabel.TOP);
    setAlignmentY(TOP_ALIGNMENT);

    add(label);
}
用于将JLabel添加到JPanel的方法:

public void increaseLineNumber() {
    lineCount++;

    JLabel tempLabel = new JLabel(String.valueOf(lineCount));
    tempLabel.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 15));

    tempLabel.setVerticalAlignment(JLabel.TOP);
    tempLabel.setHorizontalAlignment(JLabel.CENTER);
    tempLabel.setVerticalTextPosition(JLabel.TOP);

    revalidate();
    this.add(tempLabel);
}
添加新JLabel时的当前外观:


您应该尝试相应地设置标签的首选大小。不幸的是,不清楚您使用的是哪种布局管理器。

不要使用
网格布局。它将拉伸您的组件。如果使用
BoxLayout
它将不会

BoxLayout
的便利类是
Box
。你能行

Box box = Box.createVerticalBox();
add(box);
然后只需将标签添加到
框中

box.add(label);
示例

import java.awt.*;
import javax.swing.*;
import javax.swing.border.BevelBorder;

public class BoxLabels {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                Box box = Box.createVerticalBox();
                Font font = new Font("monospaced", Font.PLAIN, 11);

                JPanel sideBar = new JPanel();
                sideBar.setBackground(Color.BLACK);
                sideBar.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
                sideBar.add(box);

                JTextArea text = new JTextArea(15, 50);
                text.setMargin(new Insets(5, 5, 5, 5));
                text.setBackground(Color.darkGray);
                text.setForeground(Color.white);
                text.setFont(font);

                int count = 1;
                for (int i = 0; i < 10; i++) {
                    JLabel label = new JLabel(String.valueOf(count));
                    label.setFont(font);
                    label.setForeground(Color.GREEN);
                    box.add(label);
                    count++;
                }

                JPanel panel = new JPanel(new BorderLayout());
                panel.add(text);
                panel.add(sideBar, BorderLayout.WEST);

                JOptionPane.showMessageDialog(null, panel);
            }
        });
    }
}

import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.BevelBorder;
公共类标签{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
Box=Box.createVerticalBox();
Font Font=新字体(“等距”,Font.PLAIN,11);
JPanel侧边栏=新的JPanel();
侧边栏。背景(颜色。黑色);
侧边栏.setOrder(BorderFactory.createBevelOrder(BevelOrder.LOWERED));
边栏。添加(框);
JTextArea text=新的JTextArea(15,50);
setMargin(新插图(5,5,5,5));
text.setBackground(Color.darkGray);
设置前景(颜色为白色);
text.setFont(字体);
整数计数=1;
对于(int i=0;i<10;i++){
JLabel label=新的JLabel(String.valueOf(count));
label.setFont(字体);
标签。设置前景(颜色。绿色);
添加(标签);
计数++;
}
JPanel panel=newjpanel(newborderlayout());
添加(文本);
panel.add(侧栏,BorderLayout.WEST);
showMessageDialog(空,面板);
}
});
}
}


参见

上的更多和其他布局管理器,我使用了GridLayout(0,1);在主面板上,但尚未将LayoutManager应用于JLabel。您是将标签添加到ContentPane还是为标签添加了一个额外的JPanel?我将标签添加到JPanel中,标签在其中被实例化。然后,我将该JPanel添加到包含JTextArea的JPanel中,将两者结合起来,以获得脚本编辑器的外观。只要您对包含JLabel的面板使用LayoutManager,而该面板不会调整面板中组件的大小,那么对ContentPane使用GridLayout就没有问题。BoxLayout或FlowLayout是一个不错的选择。即使是GridLayout也应该可以,如果您只需添加更多指示空linesOk的标签。。。因此,解决方案是将包含JLabel的面板的LayoutManager更改为其他内容,即BoxLayout。为了获得更多的控制,您可以使用GridBayLayout或绝对布局。不要忘记相应地设置JLabel的大小。