Java 如何使用GridBagLayout将组件放置在右下角?

Java 如何使用GridBagLayout将组件放置在右下角?,java,swing,user-interface,scala,layout,Java,Swing,User Interface,Scala,Layout,我需要在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 Grid

我需要在
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)
但由于某些原因,文本区域位于中心:

我做错了什么?

例如:

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();
         }
      });
   }
}


…如果您真的想使用GridBagLayout,您必须在
gridx=0
gridy=0
上放置一个虚拟组件(使用
Box.createGlue()
制作一个虚拟组件),并将要放置在
gridx=1
右下角的组件,
gridy=1

您还没有阅读代码中显示的GridBagLayout教程(只添加一个组件,不添加一些虚拟组件来填充JPanel,放置gridx和gridy 0,不设置所有相关的GridBagConstraint…),如果不先学习,您不能期望任何复杂的东西都能工作。不管怎样,我会使用嵌套的JPanel,使用更简单的布局,如BorderLayouts。@HoverCraftFullOfels-我希望只有一个单元格,组件放置在右下角(通过设置锚定约束)。还有什么其他约束与此相关呢?weightx,weighty,但不管怎样,如果您只添加一个组件,那么GridBagLayout就无法完成。同样,嵌套JPanel,每个都有自己的布局。同样,BorderLayout也可以很好地工作……这可以通过GridBagLayout来完成:)是的,您使用了长方体的“胶水”作为虚拟组件。干得好,1+。这对我更有效。出于某种原因,当我使用两个边框布局时,主面板的整个右侧部分被涂成灰色。
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);