2012-06-22 56 views
1

是否有简单的方法来限制JTable中行的总体选择?我的意思是我想让用户使用shift和ctrl来选择最多X行。如果他再次点击一行,则会取消所有选择。对当前行为进行排序,但限制所选行的总量。JTable中的限制行选择

这是我目前的实现,对于如何以图形方式限制选择,我有点无知。

public class RoomsListView extends AbstractViewPanel { 

public RoomsListView(DefaultController controller) 
{ 
    this.controller = controller; 
    initUI(); 
} 

private void initUI() 
{ 
    tableT = new JTable(RoomsModel.getInstance()); 
    sorter = new TableRowSorter<RoomsModel>(RoomsModel.getInstance()); 
    tableT.setRowSorter(sorter); 

    tableT.setPreferredScrollableViewportSize(new Dimension(CUSTOM_TABLE_WIDTH, CUSTOM_TABLE_HEIGHT)); 

    tableT.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent e) { 
      rowClickedPerformed(e); 
     } 
    }); 
} 

private void rowClickedPerformed(MouseEvent e) 
{ 

} 

public void modelPropertyChange(PropertyChangeEvent evt) 
{ 
} 

public JTable getTable() 
{ 
    return tableT; 
} 

private final int CUSTOM_TABLE_WIDTH = -1; 
private final int CUSTOM_TABLE_HEIGHT = 150; 

private JTable tableT; 
private DefaultController controller; 
private TableRowSorter<RoomsModel> sorter; 

}

回答

3

对于你的情况

.addMouseListener(new MouseAdapter() { 
    public void mouseClicked(MouseEvent e) { 
    int row = m_table.getSelectedRow(); 
    int col = m_table.getSelectedColumn(); 
    } 
}); 

只是检查last - first < X

或类似这样的

SelectionListener listener = new SelectionListener(table); 
table.getSelectionModel().addListSelectionListener(listener); 
table.getColumnModel().getSelectionModel() 
    .addListSelectionListener(listener); 

public class SelectionListener implements ListSelectionListener { 
    JTable table; 

    // It is necessary to keep the table since it is not possible 
    // to determine the table from the event's source 
    SelectionListener(JTable table) { 
     this.table = table; 
    } 
    public void valueChanged(ListSelectionEvent e) { 
     // If cell selection is enabled, both row and column change events are fired 
     if (e.getSource() == table.getSelectionModel() 
       && table.getRowSelectionAllowed()) { 
      // Column selection changed 
      int first = e.getFirstIndex(); 
      int last = e.getLastIndex(); 
     } else if (e.getSource() == table.getColumnModel().getSelectionModel() 
       && table.getColumnSelectionAllowed()){ 
      // Row selection changed 
      int first = e.getFirstIndex(); 
      int last = e.getLastIndex(); 
     } 

     if (e.getValueIsAdjusting()) { 
      // The mouse button has not yet been released 
     } 
    } 
} 
+0

不得不调整,因为我允许选择,如第一,第三和第五,它不仅仅是一个移动动作,而是一个用于选择元素的ctrl动作。所以range

+0

是的,您可以计算事件中的选择行 –

1

这可能有助于给行选择限制邻ne选择

table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);