java - 如何在 DefaultListModel 中添加 JButton?

标签 java swing jlist listcellrenderer

我正在制作一款战舰游戏,我正在尝试找出一种方法来控制 Pane 中的按钮,以便我可以拖放它们并使用默认列表模型跟踪它们的索引。如果我添加字符串或 ImageIcons它工作正常,但使用按钮我得到了不同的东西。

这是我的代码:

public class ListModelExample extends JPanel {

  JList list;
  DefaultListModel model;
  int counter = 15;

  public ListModelExample() {
    setLayout(new BorderLayout());
    model = new DefaultListModel();
    list = new JList(model);
    JScrollPane pane = new JScrollPane(list);
    JButton addButton = new JButton("Add Element");
    JButton removeButton = new JButton("Remove Element");
    final JButton button = new JButton("button");

    for (int i = 0; i < 5; i++)
      model.addElement(button);

    addButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        model.addElement(button);
        counter++;    

      }
    });
    removeButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        if (model.getSize() > 0)
          model.removeElementAt(0);
      }
    });

    add(pane, BorderLayout.NORTH);
    add(addButton, BorderLayout.WEST);
    add(removeButton, BorderLayout.EAST);
  }

  public static void main(String s[]) {
    JFrame frame = new JFrame("List Model Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(new ListModelExample());
    frame.setSize(260, 200);
    frame.setVisible(true);

  }
}

如果我添加按钮,我会得到这个结果:

Result of adding buttons in the pane

所以我的问题是:如何让按钮正常显示而不是默认列表模型中的文本?

最佳答案

  • 这只能由 Renderer 完成,只将 String 值放入 DefaultListModel

  • 不要将任何 JComponents 放入 XxxModel

  • 我会使用 JPanelJButtons 而不是 JList 作为容器(需要更改 getScrollableBlockIncrement/getScrollableUnitIncrementJListJTable 相比自然滚动

关于上午两种方式的例子

import java.awt.*;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import javax.swing.*;

public class ListButtons extends JFrame {

    private static final long serialVersionUID = 1L;

    public ListButtons() {
        setLayout(new GridLayout(0, 2, 10, 10));
        DefaultListModel model = new DefaultListModel();
        model.addElement(createButtons("one"));
        model.addElement(createButtons("two"));
        model.addElement(createButtons("three"));
        model.addElement(createButtons("four"));
        model.addElement(createButtons("five"));
        model.addElement(createButtons("six"));
        model.addElement(createButtons("seven"));
        model.addElement(createButtons("eight"));
        model.addElement(createButtons("nine"));
        model.addElement(createButtons("ten"));
        model.addElement(createButtons("eleven"));
        model.addElement(createButtons("twelwe"));
        JList list = new JList(model);
        list.setCellRenderer(new PanelRenderer());
        JScrollPane scroll1 = new JScrollPane(list);
        final JScrollBar scrollBar = scroll1.getVerticalScrollBar();
        scrollBar.addAdjustmentListener(new AdjustmentListener() {

            @Override
            public void adjustmentValueChanged(AdjustmentEvent e) {
                System.out.println("JScrollBar's current value = " + scrollBar.getValue());
            }
        });
        add(scroll1);
        JScrollPane scroll2 = new JScrollPane(createPanel());
        add(scroll2);        
        final JScrollBar scrollBar1 = scroll2.getVerticalScrollBar();
        scrollBar1.addAdjustmentListener(new AdjustmentListener() {

            @Override
            public void adjustmentValueChanged(AdjustmentEvent e) {
                System.out.println("JScrollBar's current value = " + scrollBar1.getValue());
            }
        });

    }

    public static JPanel createPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(0, 1, 1, 1));
        panel.add(createButtons("one"));
        panel.add(createButtons("two"));
        panel.add(createButtons("three"));
        panel.add(createButtons("four"));
        panel.add(createButtons("five"));
        panel.add(createButtons("six"));
        panel.add(createButtons("seven"));
        panel.add(createButtons("eight"));
        panel.add(createButtons("nine"));
        panel.add(createButtons("ten"));
        panel.add(createButtons("eleven"));
        panel.add(createButtons("twelwe"));
        return panel;
    }

    public static JButton createButtons(String text) {
        JButton button = new JButton(text);
        return button;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                ListButtons frame = new ListButtons();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                //frame.pack();
                frame.setSize(270, 200);
                frame.setVisible(true);
            }
        });
    }

    class PanelRenderer implements ListCellRenderer {

        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JButton renderer = (JButton) value;
            renderer.setBackground(isSelected ? Color.red : list.getBackground());
            return renderer;
        }
    }
}

关于java - 如何在 DefaultListModel 中添加 JButton?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15863048/

相关文章:

java - 强制更新 JList

java - 在 vaadin 中自动完成?

java - JDialog setLocation 被忽略

java - 将扩展 JTable 添加到 JFrame

Java 按状态对 jlist 进行排序

java - 如何在 JFrame 中切换 JPanel

java - JLIST 的 setSelectedValue 方法出错

java - JLists - 列表中的元素数

java - 以编程方式更改区域设置在某些设备中不起作用

java - 对任务感到困惑。在循环中更改字符串名称保持相同的循环继续