2014-07-06 29 views
0

我有一组按钮将停留在面板中间。我试图将它们放置在面板的顶部,使其处于流畅的布局约束中。任何帮助实现这一点非常感谢。我试过码头,但没有做任何事情。Miglayout将组件对齐到单元格顶部

private class ProductPanel extends JPanel { 

    private JLabel lblProd; 
    private JButton butAdd; 
    private JButton butRemove; 
    private JButton butEdit; 
    private Product_Table_Model ptm; 
    private JScrollPane scroll; 
    private JPanel buttonPanel; 
    private JTable table; 

    ProductPanel() { 

     setLayout(new MigLayout("debug")); 

     ptm = new Product_Table_Model(
       (ArrayList<Product>) client 
         .receiveObject("Get_Product_Data")); 

     initComponents(); 

    } 

    public void initComponents() { 

     lblProd = new JLabel ("Product List: "); 

     buttonPanel = new JPanel (new MigLayout()); 
     butAdd = new JButton ("Add"); 
     butRemove = new JButton ("Remove"); 
     butEdit = new JButton ("Edit"); 
     buttonPanel.add(butAdd, "cell 0 0"); 
     buttonPanel.add(butRemove, "cell 0 1"); 
     buttonPanel.add(butEdit, "cell 0 2"); 

     butAdd.setPreferredSize(new Dimension(40, 50)); 

     add(lblProd, "wrap"); 

     table = new JTable(ptm); 
     table.setFillsViewportHeight(true); 
     scroll = new JScrollPane(table); 

     add(scroll); 
     add(buttonPanel); 


    } 

} 
+0

您需要提供完整的示例。必须有另一个问题;流水模式下的按钮默认对齐顶部。 –

+0

更新了代码,试图做一个图像,但我没有10的声望。 – Grim

回答

2

按钮按照预期与顶部对齐。这是面板本身 未在其单元内对齐。所以下面将解决这个问题:

add(buttonPanel, "top");

你不应该与setPrefferedSize()方法来设置优先停留大小。 而是使用尺寸组。

MigLayout是非常强大的布局管理器,您不需要创建两个带有两个布局管理器的 面板。您可以更轻松地创建布局。 下面的例子是这样一个解决方案:

package com.zetcode; 

import java.awt.EventQueue; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import net.miginfocom.swing.MigLayout; 

public class ProductPanel2 extends JPanel { 

    private JLabel lblProd; 
    private JButton butAdd; 
    private JButton butRemove; 
    private JButton butEdit; 
    private JScrollPane scroll; 
    private JTable table; 

    public ProductPanel2() { 

     initComponents(); 
    } 

    private void initComponents() { 

     setLayout(new MigLayout()); 

     lblProd = new JLabel("Product List: "); 

     butAdd = new JButton("Add"); 
     butRemove = new JButton("Remove"); 
     butEdit = new JButton("Edit"); 

     table = new JTable(); 
     table.setFillsViewportHeight(true); 
     scroll = new JScrollPane(table);   

     add(lblProd, "wrap"); 
     add(scroll); 
     add(butAdd, "split 3, flowy, top, sgx"); 
     add(butRemove, "sgx"); 
     add(butEdit, "sgx");   
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       ProductPanel2 pane = new ProductPanel2(); 
       frame.setContentPane(pane); 
       frame.setSize(350, 250); 
       frame.setLocationRelativeTo(null); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     });   

    } 
} 

下表中被分成三个子电池细胞。插入这些子单元中的三个按钮是 。垂直流动模式通过约束条件设置。 top约束将按钮对齐到顶部。最后,约束使按钮的大小相同。

Snapshot of the example

+0

sgx做什么? – Grim

+0

查看MigLayout备忘单。你有解释所有的限制。它说“它给组件一个大小组名称,所有共享一个大小组名称的组件将获得相同的BoundSize(min/preferred/max)。”语法是:sg [name],sgx [name],sgy [name]之一。默认情况下按钮的高度相同,所以在我们的例子中,sgx就足够了。示例中只有一个大小组,因此我们不必指定它的名称。 –