Swing/ButtonsInListCell のバックアップソース(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/ButtonsInListCell へ行く。
- 1 (2011-10-05 (水) 00:35:28)
- 2 (2012-12-16 (日) 01:45:20)
- 3 (2013-08-09 (金) 20:59:23)
- 4 (2013-08-17 (土) 01:12:43)
- 5 (2013-11-20 (水) 16:13:40)
- 6 (2015-01-14 (水) 15:45:25)
- 7 (2016-04-19 (火) 16:04:48)
- 8 (2016-11-18 (金) 14:34:33)
- 9 (2017-11-22 (水) 15:25:47)
- 10 (2019-07-19 (金) 17:06:18)
- 11 (2021-03-21 (日) 04:16:32)
- 12 (2024-02-02 (金) 11:32:13)
TITLE:JListのセル内にJButtonを配置する #navi(../) #tags(JList, JButton, ListCellRenderer) RIGHT:Posted by &author(aterai); at 2011-10-03 * JListのセル内にJButtonを配置する [#f39bded5] `JList`のセル内に複数の`JButton`を配置します。 - &jnlp; - &jar; - &zip; #ref(https://lh3.googleusercontent.com/-j4_Xv9F17Jc/TolDAZSkQUI/AAAAAAAABDU/GK_sK9k5aJE/s800/ButtonsInListCell.png) ** サンプルコード [#oc796928] #code(link){{ class ButtonsRenderer extends JPanel implements ListCellRenderer { public JTextArea label = new JTextArea(); private final JButton viewButton = new JButton(new AbstractAction("view") { @Override public void actionPerformed(ActionEvent e) { System.out.println("aaa"); } }); private final JButton editButton = new JButton(new AbstractAction("edit") { @Override public void actionPerformed(ActionEvent e) { System.out.println("bbb"); } }); public ButtonsRenderer() { super(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(5,5,5,0)); setOpaque(true); label.setLineWrap(true); label.setOpaque(false); add(label); Box box = Box.createHorizontalBox(); for(JButton b: java.util.Arrays.asList(viewButton, editButton)) { b.setFocusable(false); b.setRolloverEnabled(false); box.add(b); box.add(Box.createHorizontalStrut(5)); } add(box, BorderLayout.EAST); } private final Color evenColor = new Color(230,255,230); @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean hasFocus) { label.setText((value==null)?"":value.toString()); if(isSelected) { setBackground(list.getSelectionBackground()); label.setForeground(list.getSelectionForeground()); }else{ setBackground(index%2==0 ? evenColor : list.getBackground()); label.setForeground(list.getForeground()); } for(JButton b: java.util.Arrays.asList(viewButton, editButton)) { b.getModel().setRollover(false); b.getModel().setArmed(false); b.getModel().setPressed(false); b.getModel().setSelected(false); } if(button!=null) { if(index==pressedIndex) { button.getModel().setSelected(true); button.getModel().setArmed(true); button.getModel().setPressed(true); }else if(index==rolloverIndex) { button.getModel().setRollover(true); } } return this; } public int pressedIndex = -1; public int rolloverIndex = -1; public JButton button = null; } }} ** 解説 [#fa1d498d] 上記のサンプルでは、`JList`のセルに`2`つの`JButton`を配置する`ListCellRenderer`を設定しています。 `JButton`のクリックイベントは、`JList`に追加したマウスリスナーで`SwingUtilities.getDeepestComponentAt(...)`を使用して対象の`JButton`を取得し、`JButton#doClick()`を呼び出すようになっています。 ** 参考リンク [#c6b43733] - [[JTableのセルに複数のJButtonを配置する>Swing/MultipleButtonsInTableCell]] ** コメント [#h3d1b37d] #comment