Swing/ButtonsInListCell のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- 13 (2025-01-03 (金) 08:57:02)
- 14 (2025-01-03 (金) 09:01:23)
- 15 (2025-01-03 (金) 09:02:38)
- 16 (2025-01-03 (金) 09:03:21)
- 17 (2025-01-03 (金) 09:04:02)
- 18 (2025-06-19 (木) 12:41:37)
- 19 (2025-06-19 (木) 12:43:47)
 
TITLE:JListのセル内にJButtonを配置する
Posted by aterai at 2011-10-03
JListのセル内にJButtonを配置する
JListのセル内に複数のJBUttonを配置します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
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;
}
解説
上記のサンプルでは、JListのセルに2つのJButtonを配置するListCellRendererを設定しています。 JButtonのクリックイベントは、JListに追加したマウスリスナーでSwingUtilities.getDeepestComponentAt(...)を使用して対象のJButtonを取得し、JButton#doClick()を呼び出すようになっています。
