Swing/LargeCellEditor のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/LargeCellEditor へ行く。
- 1 (2006-08-28 (月) 00:57:26)
- 2 (2006-08-28 (月) 08:21:34)
- 3 (2006-08-28 (月) 16:26:07)
- 4 (2006-08-31 (木) 14:27:45)
- 5 (2006-10-29 (日) 02:01:59)
- 6 (2007-04-11 (水) 16:07:24)
- 7 (2007-07-03 (火) 19:21:07)
- 8 (2012-09-05 (水) 23:15:13)
- 9 (2013-02-24 (日) 22:28:05)
- 10 (2015-01-20 (火) 15:49:33)
- 11 (2016-05-20 (金) 19:17:07)
- 12 (2016-05-27 (金) 13:14:22)
- 13 (2017-08-31 (木) 13:54:58)
- 14 (2018-09-14 (金) 20:04:37)
- 15 (2018-10-30 (火) 16:36:36)
- 16 (2018-12-21 (金) 14:09:26)
- 17 (2020-11-22 (日) 01:13:23)
- 18 (2023-01-20 (金) 17:37:28)
TITLE:JTableにセルより大きなセルエディタを使用
JTableにセルより大きなセルエディタを使用
編集者:Terai Atsuhiro
作成日:2006-08-28
更新日:2023-01-20 (金) 17:37:29
概要
通常のセルエディタの変わりに、セルより大きなアイコンを選択する為のセルエディタを使用してJTableを編集します。
#screenshot
サンプルコード
class IconTable extends JTable { private final MyGlassPane panel = new MyGlassPane(); private final EditorFromList editor; private final JFrame frame; private final FocusTraversalPolicy policy; private FocusTraversalPolicy ftp; private Rectangle rect; public IconTable(JFrame _frame, TableModel model, Vector list) { super(model); setDefaultRenderer(Object.class, new TestRenderer()); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); initCellSize(50); frame = _frame; policy = new FocusTraversalPolicy() { public Component getFirstComponent(Container focusCycleRoot) {return null;} public Component getLastComponent(Container r) {return editor;} public Component getComponentAfter(Container r, Component c) {return editor;} public Component getComponentBefore(Container r, Component c) {return editor;} public Component getDefaultComponent(Container r) {return editor;} }; addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { startEditing(); } }); editor = new EditorFromList(list); editor.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ESCAPE) { cancelEditing(); } } }); editor.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { changeValue(me.getPoint()); } }); panel.add(editor); frame.setGlassPane(panel); panel.setVisible(false); } private void initCellSize(int size) { setRowHeight(size); JTableHeader tableHeader = getTableHeader(); tableHeader.setResizingAllowed(false); tableHeader.setReorderingAllowed(false); TableColumnModel m = getColumnModel(); for(int i=0;i<m.getColumnCount();i++) { TableColumn col = m.getColumn(i); col.setMinWidth(size); col.setMaxWidth(size); } setBorder(BorderFactory.createLineBorder(Color.black)); } private void initEditor() { Dimension dim = editor.getPreferredSize(); rect = getCellRect(getSelectedRow(), getSelectedColumn(), true); int iv = (dim.width-rect.width)/2; Point p = SwingUtilities.convertPoint(this, rect.getLocation(), panel); rect.setRect(p.x-iv, p.y-iv, dim.width, dim.height); editor.setBounds(rect); editor.setSelectedValue(getValueAt(getSelectedRow(), getSelectedColumn()), true); } public void startEditing() { initEditor(); ftp = frame.getFocusTraversalPolicy(); panel.setVisible(true); editor.requestFocusInWindow(); frame.setFocusTraversalPolicy(policy); } private void cancelEditing() { frame.setFocusTraversalPolicy(ftp); panel.setVisible(false); } private void changeValue(Point p) { frame.setFocusTraversalPolicy(ftp); Object o = editor.getModel().getElementAt(editor.locationToIndex(p)); if(o != null) { setValueAt(o, getSelectedRow(), getSelectedColumn()); } panel.setVisible(false); } }
- &jnlp;
- &jar;
- &zip;
解説
通常のセルエディタは使用しないため、すべてのセルを編集不可にしています。かわりにセルをクリックしたときに、フレームのGlassPaneを有効にして、そこにJListで作成したアイコン選択エディタや、その影などを描画しています。