如何将JLabel和JTextField仅添加到BorderLayout中心的底部?

时间:2015-05-30 04:08:23

标签: java swing layout-manager border-layout

是否有任何方法只将JLabel和JTextField添加到中心边框布局的下半部分。出于美学原因,我不想在上半部分做任何事情,也没有找到任何办法。我仍然使用swing和AWT相当新...任何建议都会非常感激。我添加了一张我想要实现的图片。

Example

3 个答案:

答案 0 :(得分:3)

BorderLayout.CENTER JPanel new GridLayout(2, 1)(2行,1列)。将空白JLabel添加到上半部空白的同一JPanel中。将另一个组件JPanel添加到BorderLayout.CENTER JPanel,让它使用GridBagLayout作为底部空间,然后使用GridBagConstraints添加标签和字段。这里的秘诀是嵌套JPanels,每个都使用选择的布局管理器。

例如:

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.*;

public class Layouts {
   private static final int TF_COLS = 8;

   private static void createAndShowGui() {
      JPanel borderLayoutPanel = new JPanel(new BorderLayout());
      borderLayoutPanel.setBorder(BorderFactory
            .createTitledBorder("BorderLayout Panel"));

      borderLayoutPanel.add(createInnerPanel("North"), BorderLayout.PAGE_START);

      borderLayoutPanel.add(createInnerPanel("North"), BorderLayout.PAGE_START);
      borderLayoutPanel.add(createInnerPanel("South"), BorderLayout.PAGE_END);
      borderLayoutPanel.add(createInnerPanel("East"), BorderLayout.LINE_END);
      borderLayoutPanel.add(createInnerPanel("West"), BorderLayout.LINE_START);

      JPanel centerPanel = new JPanel(new GridLayout(2, 1));
      centerPanel.add(new JLabel());

      JPanel gblPanel = new JPanel(new GridBagLayout());
      gblPanel.add(new JLabel("Question 1:"), createGbc(0, 0));
      gblPanel.add(new JTextField(TF_COLS), createGbc(1, 0));
      gblPanel.add(new JLabel("Question 2:"), createGbc(0, 2));
      gblPanel.add(new JTextField(TF_COLS), createGbc(1, 2));

      centerPanel.add(gblPanel);

      borderLayoutPanel.add(centerPanel);

      JFrame frame = new JFrame("Layouts");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(borderLayoutPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   private static GridBagConstraints createGbc(int x, int y) {
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = x;
      gbc.gridy = y;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;
      gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST;
      gbc.fill = GridBagConstraints.HORIZONTAL;
      gbc.weightx = 1.0;
      gbc.weighty = 1.0;
      int iGap = 5;
      gbc.insets = (x == 0) ? new Insets(iGap, iGap, iGap, 3 * iGap) : new Insets(
            iGap, iGap, iGap, iGap);
      return gbc;
   }

   private static JComponent createInnerPanel(String text) {
      JPanel panel = new JPanel();
      panel.add(new JLabel(text));
      panel.setBorder(BorderFactory.createEtchedBorder());
      return panel;
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

是的,这比简单地设置边界更初始工作,但最终节省时间和挫折的是你必须稍后维护这个GUI,因为如果你使用适当的布局,它将更容易调试,增强或改变您的GUI。它也有更好的机会在所有平台和屏幕分辨率上看起来不错。

答案 1 :(得分:2)

使用EmptyBorder

可轻松完成此操作
centerPanel.setBorder(new EmptyBorder(top, left, bottom, right));

答案 2 :(得分:-1)

我通常使用set bounds但是可以随意查看其他布局,例如gridbaglayout,它允许你制作一个类似于布局的网格,你可以将特定组件放入其中。查看此链接以查看它的外观。 https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html