我想创建一个带有文本栏,进度条和不是的状态栏。然而,事情正在扼杀。
起初我只有文本栏和状态栏看起来像下面的示例(我不需要父容器):
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());
}
}
我可以把它作为一个新问题,但我认为它不值得......
答案 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