2

有没有一种简单的方法来限制 JTable 中行的总选择?我的意思是我想让用户使用 shift 和 ctrl 来选择最多 X 行。如果他再次单击一行,它将取消所有选择。排序它当前的行为方式,但同时限制所选行的总数。

这是我当前的实现,我对如何以图形方式限制选择一无所知。

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;

}

4

2 回答 2

4

对于您的情况

.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
        }
    }
}
于 2012-06-22T21:11:28.627 回答
1

这可能有助于将行选择限制为一个选择

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

于 2014-10-30T05:05:09.457 回答