[英]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.