JTable에서 여러 개의 열 선택하기
조회수 3373회
첫 번째 행은 수정 불가능한 텍스트이고 두 번째 행은 boolean값을 나타내는 체크 박스로 이루어진 JTable이 하나 있습니다. 제가 원하는 것은, 유저가 여러 개의 열을 선택한 상태에서 선택한 체크 박스 중 체크가 되어있는 아무 박스의 체크를 풀었을 때 선택된 체크 박스 중 체크가 되어있는 박스들의 체크를 모두 푸는 것입니다. 반대 상황도 마찬가지로요. 어떻게 할까요? 도와주세요.
1 답변
-
Hovercraft님의 예시자료와 camickr님의 조언을 참고하였고요, 아래 예시자료가 적절한 유저 인터페이스를 보여주고 있습니다. 비록 버튼을 사용했지만, 메뉴나 팝업을 사용할 때도 SelectionAction 이 유용할 것입니다.
http://i.stack.imgur.com/TWYHC.png
import java.awt.*; import java.awt.event.ActionEvent; import javax.swing.*; import javax.swing.DefaultListSelectionModel; import javax.swing.table.DefaultTableModel; /** @see http://stackoverflow.com/questions/4526779 */ public class CheckABunch extends JPanel { private static final int CHECK_COL = 1; private static final Object[][] DATA = { {"One", Boolean.TRUE}, {"Two", Boolean.FALSE}, {"Three", Boolean.TRUE}, {"Four", Boolean.FALSE}, {"Five", Boolean.TRUE}, {"Six", Boolean.FALSE}, {"Seven", Boolean.TRUE}, {"Eight", Boolean.FALSE}, {"Nine", Boolean.TRUE}, {"Ten", Boolean.FALSE}}; private static final String[] COLUMNS = {"Number", "CheckBox"}; private DataModel dataModel = new DataModel(DATA, COLUMNS); private JTable table = new JTable(dataModel); private DefaultListSelectionModel selectionModel; public CheckABunch() { super(new BorderLayout()); this.add(new JScrollPane(table)); this.add(new ControlPanel(), BorderLayout.SOUTH); table.setPreferredScrollableViewportSize(new Dimension(250, 175)); selectionModel = (DefaultListSelectionModel) table.getSelectionModel(); } private class DataModel extends DefaultTableModel { public DataModel(Object[][] data, Object[] columnNames) { super(data, columnNames); } @Override public Class<?> getColumnClass(int columnIndex) { if (columnIndex == CHECK_COL) { return getValueAt(0, CHECK_COL).getClass(); } return super.getColumnClass(columnIndex); } @Override public boolean isCellEditable(int row, int column) { return column == CHECK_COL; } } private class ControlPanel extends JPanel { public ControlPanel() { this.add(new JLabel("Selection:")); this.add(new JButton(new SelectionAction("Clear", false))); this.add(new JButton(new SelectionAction("Check", true))); } } private class SelectionAction extends AbstractAction { boolean value; public SelectionAction(String name, boolean value) { super(name); this.value = value; } @Override public void actionPerformed(ActionEvent e) { for (int i = 0; i < dataModel.getRowCount(); i++) { if (selectionModel.isSelectedIndex(i)) { dataModel.setValueAt(value, i, CHECK_COL); } } } } private static void createAndShowUI() { JFrame frame = new JFrame("CheckABunch"); frame.add(new CheckABunch()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { createAndShowUI(); } }); } }
댓글 입력