2012-08-02 51 views
1

在JTable的特定列下对齐其他组件(如按钮,标签等)的方法是什么?例如,我想在复选框的下方添加一个复选框,用于选择该特定列中的所有值。JTable - 在列下方对齐组件

+1

标题中的复选框怎么样? http://java-swing-tips.blogspot.de/2009/02/jtableheader-checkbox.html – Stephan 2012-08-02 13:25:06

+0

你想把JComponent放在JTable下alingh它们与当前列的wight并且调整它们的大小或调整列大小或重新排列? – mKorbel 2012-08-02 15:26:07

+0

我想把它们放在列的下方,并调整它们与调整大小 – Bober02 2012-08-02 16:12:11

回答

6

,据我了解,中TableColumnModelListener使用,从适当调整大小事件和重新排序

enter image description here

enter image description here

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.table.*; 

public class TableFilterRow extends JFrame implements TableColumnModelListener { 

    private static final long serialVersionUID = 1L; 
    private JTable table; 
    private JPanel filterRow; // Panel for text fields 

    public TableFilterRow() { 
     table = new JTable(3, 5); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
     table.getColumnModel().addColumnModelListener(this); 
     filterRow = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
     for (int i = 0; i < table.getColumnCount(); i++) { 
      filterRow.add(new JTextField(" Sum at - " + i)); 
     } 
     columnMarginChanged(new ChangeEvent(table.getColumnModel())); 
     getContentPane().add(filterRow, BorderLayout.SOUTH); 
    } 

    // Implement TableColumnModelListener methods 
    // (Note: instead of implementing a listener you should be able to 
    // override the columnMarginChanged and columMoved methods of JTable) 
    @Override 
    public void columnMarginChanged(ChangeEvent e) { 
     TableColumnModel tcm = table.getColumnModel(); 
     int columns = tcm.getColumnCount(); 

     for (int i = 0; i < columns; i++) { 
      JTextField textField = (JTextField) filterRow.getComponent(i); 
      Dimension d = textField.getPreferredSize(); 
      d.width = tcm.getColumn(i).getWidth(); 
      textField.setPreferredSize(d); 
     } 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       filterRow.revalidate(); 
      } 
     }); 
    } 

    @Override 
    public void columnMoved(TableColumnModelEvent e) { 
     Component moved = filterRow.getComponent(e.getFromIndex()); 
     filterRow.remove(e.getFromIndex()); 
     filterRow.add(moved, e.getToIndex()); 
     filterRow.validate(); 
    } 

    @Override 
    public void columnAdded(TableColumnModelEvent e) { 
    } 

    @Override 
    public void columnRemoved(TableColumnModelEvent e) { 
    } 

    @Override 
    public void columnSelectionChanged(ListSelectionEvent e) { 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new TableFilterRow(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

+1优秀方法的列调整大小.. :) – Amarnath 2012-11-14 13:47:43

+0

从来没有问过,从来不知道:-) – mKorbel 2012-11-14 13:53:29

1

JTable中的细胞比对由用于render细胞的Component的比对确定。对于在普通单元中使用,DefaultTableCellRenderer是一个JLabel,它支持全面的对齐属性;一个例子见here。要在表格标题单元格中使用,您应该首先考虑引用here的警告。一旦确定需要此类组件,此example可能会有所帮助。

image