【问题标题】:How to put component in bottom-right corner with GridBagLayout?如何使用 GridBagLayout 将组件放在右下角?
【发布时间】:2011-12-15 21:13:56
【问题描述】:

我需要在JPanel 中显示单个组件,并且我希望始终将该组件保留在右下角。我试着用 GridBagLayout 来做:

val infoArea = new TextArea {
  text = "Hello!"
  border = Swing.EmptyBorder(30)
  background = Color.RED
  editable = false
}
val p = new JPanel
p.setLayout(new GridBagLayout)
val c = new GridBagConstraints
c.gridx = 0
c.gridy = 0
c.anchor = GridBagConstraints.LAST_LINE_END
p.add(infoArea.peer,c)
val f = new JFrame
f.setContentPane(p)
f.setVisible(true)

但由于某种原因,文本区域位于中心:

我在这里做错了什么?

【问题讨论】:

  • 您还没有阅读代码中出现的 GridBagLayout 教程(仅添加一个组件而不添加一些虚拟组件来填充 JPanel,放置 gridx 和 gridy 0,而不是设置所有相关的 GridBagConstraints。 ..),如果不先学习,你不能指望任何如此复杂的事情都能奏效。无论如何,我会使用嵌套的 JPanel,使用更简单的布局,例如 BorderLayouts。
  • @HovercraftFullOfEels - 我希望只有一个单元格,并且组件放置在右下角(通过设置锚约束)。还有哪些其他相关限制?
  • weightx,对一个来说很重,但无论如何,如果您只添加一个组件,则无法使用 GridBagLayout 完成。同样,嵌套 JPanel 每个都有自己的布局。同样,BorderLayout 会很好用。
  • ...可以使用 GridBagLayout 来完成 :)

标签: java swing user-interface scala layout


【解决方案1】:

例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.*;

public class LayoutDemo {
   private static void createAndShowGui() {
      JLabel label = new JLabel("Hello");
      label.setOpaque(true);
      label.setBackground(Color.red);

      JPanel bottomPanel = new JPanel(new BorderLayout());
      bottomPanel.add(label, BorderLayout.LINE_END);

      JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add(bottomPanel, BorderLayout.PAGE_END);
      mainPanel.setPreferredSize(new Dimension(400, 400));


      JFrame frame = new JFrame("LayoutDemo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

【讨论】:

    【解决方案2】:
    final JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    frame.setLayout(new GridBagLayout());
    
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1.0;
    gbc.weighty = 1.0;
    frame.add(Box.createGlue(), gbc);
    
    final JTextArea textArea = new JTextArea("SE");
    textArea.setPreferredSize(new Dimension(50, 50));
    textArea.setOpaque(true);
    textArea.setBackground(Color.RED);
    gbc = new GridBagConstraints();
    gbc.gridx = 1;
    gbc.gridy = 1;
    gbc.fill = GridBagConstraints.NONE;
    gbc.weightx = 0.0;
    gbc.weighty = 0.0;
    frame.add(textArea, gbc);
    
    frame.setSize(640, 480);
    frame.setVisible(true);
    

    ...如果你真的想使用 GridBagLayout

    【讨论】:

    • 是的,您使用 Box 的“胶水”作为您的虚拟组件。干得好,1+。
    • 这对我来说效果更好。由于某种原因,当我使用两个边框布局时,主面板的整个右侧部分被涂成灰色。
    【解决方案3】:

    您必须在gridx = 0gridy = 0 上放置一个虚拟组件(使用Box.createGlue() 来制作一个虚拟组件),并且您要放置在右下角gridx = 1gridy = 1 的组件。@ 987654321@

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 2010-11-26
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2013-05-16
      相关资源
      最近更新 更多