Java 在JPanel中水平和垂直居中对象的最佳方式是什么

Java 在JPanel中水平和垂直居中对象的最佳方式是什么,java,swing,jpanel,layout-manager,Java,Swing,Jpanel,Layout Manager,我试图在panelMain的左侧添加一个面板p1。由于对象不是垂直居中的,所以我尝试将p1添加到p2上,p2具有BorderLayout。我想这不是一个好方法,但它甚至不起作用。我没有使用GridLayout,因为我不想让对象填满整个JPanel JPanel panelMain = new JPanel( new BorderLayout() ); JPanel p1 = new JPanel( new FlowLayout(FlowLayout.CENTER) ); panelText.s

我试图在panelMain的左侧添加一个面板p1。由于对象不是垂直居中的,所以我尝试将p1添加到p2上,p2具有BorderLayout。我想这不是一个好方法,但它甚至不起作用。我没有使用GridLayout,因为我不想让对象填满整个JPanel

JPanel panelMain = new JPanel( new BorderLayout() );

JPanel p1 = new JPanel( new FlowLayout(FlowLayout.CENTER) );
panelText.setPreferredSize( new Dimension( 250, frame.getHeight() ) );
panelText.add( new JLabel( "Name:", SwingConstants.RIGHT) );
panelText.add( new JTextField( "First Last:", 15 ) );
panelText.add( new JLabel( " Tel:", SwingConstants.RIGHT) );
panelText.add( new JTextField( "000-000-0000", 15) );

JPanel p2 = new JPanel( new BorderLayout() );
p2.add( p1, BorderLayout.CENTER );

panelMain.add( p2,BorderLayout.WEST );
“在JPanel中水平和垂直居中对象的最佳方式是什么?”

您可以在
JPanel
中包装所有内容,然后在另一个
JPanel
中使用
GridBagLayout

JPanel mainPanel = your main panel
JPanel wrapperPanel = new JPanel(new GridBagLayout());
wrapperPanel.add(mainPanel);
frame.add(wrapperPanel);
示例

import java.awt.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class TestCenterGridbagLayout {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JPanel mainPanel = new JPanel(new GridLayout(3, 3));
                for (int i = 0; i < 9; i++) {
                    mainPanel.add(new JButton("Button"));
                }
                mainPanel.setBorder(new TitledBorder("Main Panel"));

                JPanel wrapperPanel = new JPanel(new GridBagLayout());
                wrapperPanel.setPreferredSize(new Dimension(350, 300));
                wrapperPanel.add(mainPanel);
                wrapperPanel.setBorder(new TitledBorder("Wrapper panel with GridbagLayout"));

                JOptionPane.showMessageDialog(null, wrapperPanel);

            }
        });
    }
}

import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.TitledBorder;
公共类TestCenterGridbagLayout{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
JPanel主面板=新JPanel(新网格布局(3,3));
对于(int i=0;i<9;i++){
添加(新的JButton(“按钮”));
}
主面板订单(新标题边框(“主面板”);
JPanel wrapperPanel=newjpanel(newgridbaglayout());
wrapperPanel.setPreferredSize(新尺寸(350300));
添加(主面板);
wrapperPanel.setOrder(新标题边框(“带有GridbagLayout的包装面板”);
showMessageDialog(null,wrapperPanel);
}
});
}
}

您得到的输出是什么?有关将组件或容器置于中心的两种布局(
GridBagLayout
BoxLayout
),请参阅。