使用 MigLayout 设置 JTable 首选大小时组件移动

Components moving when JTable Preferred Size Set Using MigLayout

我一直在使用 MigLayout 布局管理器设计 Java 应用程序,但在设置 JTable 的首选大小后 运行 遇到了问题。我希望 JTable 顶部的组件居中,在我为 JTable 设置首选大小之前就是这种情况。这部分程序的代码如下:

 public MRGSCareersManagement(){
    super("") ;
    setLookAndFeel() ;

    GraphicsConfiguration config = this.getGraphicsConfiguration();
    Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice());
    this.setMaximizedBounds(new Rectangle(0, 0, usableBounds.width, usableBounds.height));
    this.setExtendedState((this.getExtendedState() & this.MAXIMIZED_BOTH) == this.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH);

    this.setLayout(new MigLayout("align 50% 0%")) ;

    left = new JButton() ;  
    left.setIcon(new ImageIcon("src\mrgscareersmanagement\images\leftImage.png"));
    left.setFocusPainted(false);
    left.setContentAreaFilled(false);
    left.setBackground(Color.white);
    left.addActionListener(this) ;

    right = new JButton() ;
    right.setIcon(new ImageIcon("src\mrgscareersmanagement\images\rightImage.png"));
    right.setFocusPainted(false);
    right.setContentAreaFilled(false);
    right.setBackground(Color.white);
    right.addActionListener(this) ;


    header = new JLabel("Careers Management", SwingConstants.CENTER) ;
    header.setFont(new Font("Arial", Font.PLAIN, 35));
    header.setOpaque(true);
    header.setBackground(Color.pink) ;

    subHeader = new JLabel("", SwingConstants.CENTER) ;
    subHeader.setFont(new Font("Helvetica", Font.PLAIN, 20));
    subHeader.setOpaque(true);
    subHeader.setBackground(Color.pink) ;

    tableWidth = (int) (usableBounds.width * 0.7) ;
    tableHeight = (int) (usableBounds.height * 0.7) ;

    JTable table = new JTable(tableData, columnNames);
    JScrollPane tableScrollPane = new JScrollPane(table);
    table.setPreferredScrollableViewportSize(new Dimension(tableWidth, tableHeight));
    table.setFillsViewportHeight(true);
    table.setShowGrid(true);
    table.setGridColor(Color.BLACK);
    table.setBackground(Color.pink) ;

    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
    centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
    for(int i = 0; i < 5; i++){
        table.getColumnModel().getColumn(i).setCellRenderer(centerRenderer);
    }

    this.getContentPane().setBackground( Color.white );

    this.add(left, "span 1 2") ;
    this.add(header, "align center") ;
    this.add(right, "span 1 2, wrap") ;
    this.add(subHeader, "align center, cell 1 1, wrap") ;
    this.add(tableScrollPane, "align center, span") ;

    setBackground(new Color(1.0f,1.0f,1.0f));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
    setVisible(true) ;
    open() ;
}

private void setLookAndFeel() {  //Set UI manager
    try {  //Handle errors when setting UI manager
        UIManager.setLookAndFeel(  //Set Nimbus as UI manager
                "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" 
        );
    } 
    catch(Exception exc) {   //Ignore Error
    }   
}

当前应用程序如下所示:https://imgur.com/mfadtrA

那么如何将内容置于 table 上方(即 header 部分和箭头)?

谢谢

只使用框架的默认BorderLayout

使用 BorderLayout.CENTER 将包含 JTable 的 JScrollPane 添加到框架中。

然后创建一个 "wrapper" 面板来容纳一个包含您想要居中的组件的子面板,并使用 BorderLayout.PAGE_START 将此面板添加到框架中。此面板的默认布局是组件居中的 FlowLayout。所以现在您需要做的就是使用 "header" 组件创建另一个面板并将此面板添加到包装器面板。

所以基本代码是:

JPanel child = new JPanel( whatever layout manager you want );
child.add(...);
child.add(...);
JPanel wrapper = new JPanel();
wrapper.add( child );
frame.add(wrapper, BorderLayout.PAGE_START);