Swing/ButtonsInListCell のバックアップの現在との差分(No.6)
- category: swing folder: ButtonsInListCell title: JListのセル内にJButtonを配置する tags: [JList, JButton, ListCellRenderer] author: aterai pubdate: 2011-10-03T14:43:12+09:00 description: JListのセル内に複数のJButtonを配置します。 image:
概要
概要
JList
のセル内に複数のJButton
を配置します。
Screenshot
Advertisement
サンプルコード
サンプルコード
#spandel
class ButtonsRenderer extends JPanel implements ListCellRenderer {
#spanend
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));
#spanadd
class ButtonsRenderer<E> extends JPanel implements ListCellRenderer<E> {
#spanend
protected static final Color EVEN_COLOR = new Color(0xE6_FF_E6);
protected final JTextArea textArea = new JTextArea();
protected final JButton deleteButton = new JButton("delete");
protected final JButton copyButton = new JButton("copy");
protected final List<JButton> buttons = Arrays.asList(deleteButton, copyButton);
protected final DefaultListModel<E> model;
protected int targetIndex;
protected int pressedIndex = -1;
protected int rolloverIndex = -1;
protected JButton button;
#spanadd
#spanend
protected ButtonsRenderer(DefaultListModel<E> model) {
super(new BorderLayout()); // *1
this.model = model;
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 0));
setOpaque(true);
label.setLineWrap(true);
label.setOpaque(false);
add(label);
textArea.setLineWrap(true);
textArea.setOpaque(false);
add(textArea);
deleteButton.addActionListener(e -> {
boolean isMoreThanOneItem = model.getSize() > 1;
if (isMoreThanOneItem) {
model.remove(targetIndex);
}
});
copyButton.addActionListener(e -> model.add(targetIndex, model.get(targetIndex)));
#spanadd
#spanend
Box box = Box.createHorizontalBox();
for(JButton b: java.util.Arrays.asList(viewButton, editButton)) {
buttons.forEach(b -> {
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);
#spanadd
#spanend
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.width = 0; // VerticalScrollBar as needed
return d;
}
#spanadd
#spanend
@Override public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean hasFocus) {
label.setText((value==null)?"":value.toString());
if(isSelected) {
JList<? extends E> list, E value, int index,
boolean isSelected, boolean cellHasFocus) {
textArea.setText(Objects.toString(value, ""));
this.targetIndex = index;
if (isSelected) {
setBackground(list.getSelectionBackground());
label.setForeground(list.getSelectionForeground());
}else{
setBackground(index%2==0 ? evenColor : list.getBackground());
label.setForeground(list.getForeground());
textArea.setForeground(list.getSelectionForeground());
} else {
setBackground(index % 2 == 0 ? EVEN_COLOR : list.getBackground());
textArea.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) {
buttons.forEach(ButtonsRenderer::resetButtonStatus);
if (Objects.nonNull(button)) {
if (index == pressedIndex) {
button.getModel().setSelected(true);
button.getModel().setArmed(true);
button.getModel().setPressed(true);
}else if(index==rolloverIndex) {
} else if (index == rolloverIndex) {
button.getModel().setRollover(true);
}
}
return this;
}
public int pressedIndex = -1;
public int rolloverIndex = -1;
public JButton button = null;
#spanadd
#spanend
private static void resetButtonStatus(AbstractButton button) {
ButtonModel model = button.getModel();
model.setRollover(false);
model.setArmed(false);
model.setPressed(false);
model.setSelected(false);
}
}
View in GitHub: Java, Kotlin解説
解説
上記のサンプルでは、JList
のセルに2
つのJButton
を配置するListCellRenderer
を設定しています。
JButton
のクリックイベントは、JList
に追加したマウスリスナーでSwingUtilities.getDeepestComponentAt(...)
を使用して対象のJButton
を取得し、JButton#doClick()
を呼び出すようになっています。
JButton
のクリックイベントはJList
本体に追加したマウスリスナーでSwingUtilities.getDeepestComponentAt(...)
を使用してListCellRenderer
から対象のJButton
を取得し、JButton#doClick()
を呼び出しています。