我有一个作业,说明书指明我需要两个标签在屏幕上居中(水平和垂直)。
我知道这个问题已被多次询问,但每当我搜索到这个问题时,给出的解决方案通常是使用不同的布局管理器,比如BoxLayout。但是,说明中还指定我必须使用BorderLayout
最初我没有将标签添加到面板中,而是直接将它们添加到框架中,但是这不起作用,所以我被建议将它们放在JPanel上,但这两者都没有用。
我的代码目前看起来像这样:
JButton butSubmit = new JButton("Submit");
JButton butReset = new JButton("Reset");
JLabel nameAndReg = new JLabel("My details", SwingConstants.CENTER);
JLabel errorMsg = new JLabel("The error message", SwingConstants.CENTER);
nameAndReg.setForeground(Color.blue);
JTextField redVal = new JTextField(3);
JTextField greenVal = new JTextField(3);
JTextField blueVal = new JTextField(3);
JPanel butPanelSouth = new JPanel();
JPanel butPanelNorth = new JPanel();
JPanel labsPanel = new JPanel();
butPanelSouth.add(redVal);
butPanelSouth.add(greenVal);
butPanelSouth.add(blueVal);
butPanelSouth.add(butSubmit);
butPanelNorth.add(butReset);
labsPanel.add(nameAndReg, BorderLayout.CENTER);
labsPanel.add(errorMsg, BorderLayout.CENTER);
add(labsPanel, BorderLayout.CENTER);
add(butPanelNorth, BorderLayout.NORTH);
add(butPanelSouth, BorderLayout.SOUTH);
这就是它产生的:
如何让“我的详细信息”和“错误消息”在窗口中间垂直和水平,一个在另一个之下,仍然使用BorderLayout?
答案 0 :(得分:1)
正如我在上面的评论中所说,你应该澄清当你说&#34时的意思;说明还指明我必须使用BorderLayout
"。
如果您的内容窗格必须包含FlowLayout
,其他面板可以采用不同的布局(例如代码中,因为您在子面板中使用了JPanel
),它很容易解决你的问题。
您只需要在GridBagLayout
中添加标签,该标签使用的布局可以对齐中心的标签,例如gridx = 0
。
您的第一个标签将包含gridy = 0
和gridx = 0
,第二个标签将包含gridy = 1
和insets
。
您的第二个将完全低于第一个,您可以使用Insets.top
创建一些空白区域(在下面的代码中我使用5个像素作为labsPanel
)。
由于BorderLayout.CENTER
位于GridBagConstrains.anchor
,因此面板会占用相框中的所有空白区域,而GridBagConstrains.CENTER
默认值(labsPanel
)会确保您的标签在import java.awt.*;
import javax.swing.*;
public class Test
{
public static void main (String [] a) {
SwingUtilities.invokeLater (new Runnable () {
@Override public void run () {
createAndShowGUI ();
}
});
}
private static void createAndShowGUI () {
JFrame frame = new JFrame ("Test");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setContentPane (new MainPanel ());
frame.pack ();
frame.setLocationRelativeTo (null);
frame.setVisible (true);
}
}
class MainPanel extends JPanel
{
public MainPanel () {
super (new BorderLayout ());
JLabel nameAndReg = new JLabel ("My details", SwingConstants.CENTER);
JLabel errorMsg = new JLabel ("The error message", SwingConstants.CENTER);
nameAndReg.setForeground(Color.blue);
JPanel labsPanel = new JPanel (new GridBagLayout ());
labsPanel.add (nameAndReg);
GridBagConstraints c = new GridBagConstraints ();
c.gridy = 1;
c.insets = new Insets (5, 0, 0, 0);
labsPanel.add (errorMsg, c);
JButton butSubmit = new JButton("Submit");
JButton butReset = new JButton("Reset");
JTextField redVal = new JTextField(3);
JTextField greenVal = new JTextField(3);
JTextField blueVal = new JTextField(3);
JPanel butPanelSouth = new JPanel ();
JPanel butPanelNorth = new JPanel ();
butPanelSouth.add (redVal);
butPanelSouth.add (greenVal);
butPanelSouth.add (blueVal);
butPanelSouth.add (butSubmit);
butPanelNorth.add (butReset);
add (labsPanel, BorderLayout.CENTER);
add (butPanelNorth, BorderLayout.NORTH);
add (butPanelSouth, BorderLayout.SOUTH);
}
}
内居中。因此,标签将在框架的中间垂直和水平对齐,就像在下面的screeenshot中一样:
代码示例:
BorderLayout
如果所有你的面板必须有{{1}},那么很难达到你想要的效果,但正如我所说,这将是一个疯狂的要求。