簡體   English   中英

JLabel調整JPanel的大小

[英]JLabel resizing JPanel

我想創建一個帶有文本欄,進度條和不是的狀態欄。 然而,事情正在扼殺。

起初我只有文本欄和狀態欄看起來像下面的示例(我不需要父容器):

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

我可以把它作為一個新問題,但我不認為這是值得的......

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

因為,調用super()將執行超類的無參數構造函數,在你的情況下是JPanel。 根據javadoc

JPanel() - 創建一個帶有雙緩沖區和流布局的新JPanel。

所以當你調用super() ,會創建一個帶有FlowLayout的JPanel。

嘗試將布局更改為BorderLayout

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM