有没有办法在 BorderLayout 中移动 JPanel?

Is there a way of moving JPanel in BorderLayout?

我正在使用 BorderLayout 作为框架(第一个 "caught" 我在 tuts 中引起注意的框架)和 FlowLayout 作为标签(我认为适合的标签)我做了什么),结果显示如下:

我的objective是把“2*1”往下推一点,排序"center"。

我环顾四周,发现很多人说使用空布局,但后来又说这不是最佳选择(即使我的 window 不可调整大小),我找到的另一个解决方案是使用布局组合(除非我误解了)。

问题是最重要的一个,如果不是,那么什么才是最好的选择? (以下是使这个 window 的代码(减去 vars 和其他方法,以简化可视化)。

public Frame() {
    super("Jogo de Multiplicar!");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    setSize(300, 200);
    setResizable(false);
    getContentPane().setBackground(pink);

    mensagem = new TransparentPanel();
    operacao = new TransparentPanel();  

    //added stuff in mensagem and operacao

    add(operacao);
    add(mensagem, BorderLayout.SOUTH);
}

您可以使用 MigLayout 作为您唯一的 LayoutManager。它非常强大,通常提供其他经理所做的一切。

有了这个,将组件居中非常简单:

public class MultiplyExample extends JFrame{
    private static final long serialVersionUID = 1L;

    JLabel testLabel = new JLabel("2*2 = 4"); 
    public MultiplyExample(){
        super("Example");
        setBounds(300, 50, 200, 200);
        // Set the MigLayout, so that columns and then rows get centered
        setLayout(new MigLayout("center, center"));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(testLabel);
    }

    public static void main(String[] args) {
        JFrame testFrame = new MultiplyExample();
        testFrame.setVisible(true);
    }
}

结果:

这是 MigLayout 必须提供的演示:

http://www.miglayout.com/swingdemoapp.jnlp

这是一个快速入门指南:

http://www.miglayout.com/QuickStart.pdf

如果你使用BorderLayout,你可以把你的组件放在另一个面板上,然后使用BorderLayout.CENTER把这个放在中间:

pane.add(button, BorderLayout.CENTER);

I looked around and found a lot of people saying to use a null layout

避免该建议。每当我在论坛中看到该建议时,通常都会收到论坛中更有经验的用户的反对票。

My objective is to push the "2*1" a little bit down, to sort of "center" it.

如果您只想在顶部添加更多 space,那么您可以使用 Border:

operacao.setBorder( new EmptyBorder(...) );

阅读 How to Use Borders 上的 Swing 教程部分了解更多信息。

如果你想让它真正居中,你可以使用 BoxLayout:

Box box = Box.createVerticalBox();
box.add( Box.createVerticalGlue() );
box.add( topPanel );
box.add( Box.createVerticalGlue() );
box.add( bottomPanel );

该教程还有一个关于 How to Use BoxLayout 的部分。搜索 table 的内容。