【问题标题】:How can I add JLabel and JTextField to only the bottom of the center of BorderLayout?如何将 JLabel 和 JTextField 仅添加到 BorderLayout 中心的底部?
【发布时间】:2015-05-30 04:08:23
【问题描述】:

有没有办法将 JLabels 和 JTextField 添加到仅中心边框布局的下半部分。出于美学原因,我不想要上半部分的任何东西,也没有找到任何方法。我对使用 swing 和 AWT 还是很陌生...任何建议将不胜感激。我添加了一张我正在努力实现的目标的图片。

【问题讨论】:

    标签: java swing layout-manager border-layout


    【解决方案1】:

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

    例如:

    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。它还将有更好的机会在所有平台和屏幕分辨率上看起来都不错。

    【讨论】:

    • 太棒了!我明白你在说什么,所以我可以在我的BorderLayout.CENTER 中添加一个GridLayout
    • @ScruffyNerfherder:例如——请看代码。
    • 好的,太好了!非常感谢,我想我明白了!
    【解决方案2】:

    这很容易通过EmptyBorder 完成:

    centerPanel.setBorder(new EmptyBorder(top, left, bottom, right));
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 酷,我去看看。谢谢!
      • “我通常使用 set bounds..” 答案不应该包括那个(坏的)建议,更不用说从它开始了。
      猜你喜欢
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多