JLabel调整JPanel的大小

时间:2013-02-13 01:40:57

标签: java swing jpanel jlabel

我想创建一个带有文本栏,进度条和不是的状态栏。然而,事情正在扼杀。

起初我只有文本栏和状态栏看起来像下面的示例(我不需要父容器):

import java.awt.BorderLayout;
import java.awt.Dimension;

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

public class Main
{   
    public static void main(String[] args)
    {           
        //Display actual GUI
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Gui();
            }
        });
    }
}

class Gui
{   
    public Gui()
    {   
        JFrame masterWindow = new JFrame();

        masterWindow.setSize(1100, 800);
        masterWindow.setMinimumSize(new Dimension(400, 400));
        masterWindow.setLocationRelativeTo(null);
        masterWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel rootPanel = new JPanel();
        rootPanel.setLayout(new BorderLayout());

        StatusBar statusBar = new StatusBar();
        rootPanel.add(statusBar, BorderLayout.SOUTH);

        masterWindow.setContentPane(rootPanel);
        masterWindow.setVisible(true);
    }
}

class StatusBar extends JLabel
{
    private static final long serialVersionUID = 1L;

    StatusBar()
    {   
        super("welcomeText");
        add(textBar);

        setOpaque(true);
        setBorder(BorderFactory.createLoweredSoftBevelBorder());
    }
}

这应该是有效的。但是,请记住状态栏的高度。现在,如果将StatusBar类更改为下面的类,则高度几乎会加倍。为什么会这样?

这种设置不需要更多的垂直空间:

public class StatusBar extends JPanel
{
    private static final long serialVersionUID = 1L;

    StatusBar()
    {
        super();

        JLabel textBar = new JLabel(Main.language.getString("welcomeText"));
        add(textBar);

        setOpaque(true);
        setBorder(BorderFactory.createLoweredSoftBevelBorder());
    }
}

为什么会发生这种情况,如何阻止它?

编辑: BorderLayout确实有效,但我想使用MigLayout。

我明白了,但现在又出现了另一个问题。额外的progresBar不会停靠在东边,甚至看不到分隔符。

以下是代码:

public class StatusBar extends JPanel
{
    private static final long serialVersionUID = 1L;
    JLabel textBar;
    JProgressBar progressBar;

    StatusBar()
    {
        setLayout(new MigLayout("insets 0, gap 0!")); //Mig has some gaps inbetween components, this will remove the gaps

        textBar = new JLabel(Main.language.getString("welcomeText"));

        progressBar = new JProgressBar(0, 100);

        JSeparator separator = new JSeparator(SwingConstants.VERTICAL);

        add(textBar);
        add(separator);
        add(progressBar, "east");

        setOpaque(true);
        setBorder(BorderFactory.createLoweredSoftBevelBorder());
    }
}

我可以把它作为一个新问题,但我认为它不值得......

2 个答案:

答案 0 :(得分:1)

JPanel的布局设置为BorderLayout

   class StatusBar extends JPanel
    {
        private static final long serialVersionUID = 1L;

        StatusBar()
        {
            super();
            this.setLayout(new BorderLayout());  //set layout
            JLabel textBar = new JLabel(Main.language.getString("welcomeText"));
            add(textBar);

            setOpaque(true);
            setBorder(BorderFactory.createLoweredBevelBorder());
        }
    }

答案 1 :(得分:1)

因为调用super()将执行超类的无参数构造函数,在你的情况下是JPanel。根据javadoc

  

JPanel() - 使用双缓冲区和流布局创建一个新的JPanel。

因此,当您致电super()时,会创建一个FlowLayout的JPanel。

尝试将布局更改为BorderLayout