java - JList 覆盖单元格的 toString 以正确显示

标签 java overriding jlist point defaultlistmodel

大家好! 我有几个问题:我如何重写 JList 的方法,我有一些 Point 数组,它们喜欢在服务器端和客户端之间行走,所以我不能只重写 Point 的 toString() 。我的逻辑告诉我,我可以在 JList 或 DefaultListModel 中做到这一点,但我找不到信息(可能我不知道如何谷歌)。那么也许有人知道怎么做?

P.s.抱歉我的英语和语法;

public class PointsList extends JPanel {
    private Extra extra;
    private JList<Point> pointsList;
    private DefaultListModel<Point> listModel;

    public PointsList(Extra extra) {
        this.extra = extra;
        setBackground(Settings.pointListBackround);
        listModel = new DefaultListModel<Point>();
        pointsList = new JList<Point>(
               //Which method i must override, to change cell toString
        };
        pointsList.getSelectionModel().addListSelectionListener(getSelectionListAction());
        setLayout(new BorderLayout());
        add(pointsList);
        setPreferredSize(new Dimension(150, 100));
    }

    private ListSelectionListener getSelectionListAction() {
        return new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting()) {
                    extra.setSelectedPoint(pointsList.getSelectedValue());
                    extra.repaintCanvas();
                }
            }
        };
    }

    public void updateList() {
        listModel.removeAllElements();
        for (Map.Entry<Point, Boolean> currentPoint : extra.getPoints().entrySet()) {
            listModel.addElement(currentPoint.getKey());
        }
    }
}

我的回答:(我不想创建新类,因为这是很少的代码)

public class PointsList extends JPanel {
    private Extra extra;
    private JList<Point> pointsList;
    private DefaultListModel<Point> listModel;

    public PointsList(Extra extra) {
        this.extra = extra;
        setBackground(Settings.pointListBackround);
        listModel = new DefaultListModel<Point>();
        pointsList = new JList<Point>(listModel);
        pointsList.setCellRenderer(getRender());
        pointsList.getSelectionModel().addListSelectionListener(getSelectionListAction());
        setLayout(new BorderLayout());
        add(pointsList);
        setPreferredSize(new Dimension(150, 100));
    }

    private ListSelectionListener getSelectionListAction() {
        return new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting()) {
                    extra.setSelectedPoint(pointsList.getSelectedValue());
                    extra.repaintCanvas();
                }
            }
        };
    }

    public void updateList() {
        listModel.removeAllElements();
        for (Map.Entry<Point, Boolean> currentPoint : extra.getPoints().entrySet()) {
            listModel.addElement(currentPoint.getKey());
        }
    }

    private ListCellRenderer<Point> getRender() {
        return new ListCellRenderer<Point>() {
            @Override
            public Component getListCellRendererComponent(JList<? extends Point> list, Point value, int index, boolean isSelected, boolean cellHasFocus) {
                JLabel cell = new JLabel("(" + value.x + " , " + value.y + ")");
                cell.setForeground(Color.black);
                return cell;
            }
        };
    }
}

最佳答案

i can't just override Point's toString().

您需要使用自定义渲染器。阅读Writing a Custom Renderer Swing 教程中关于如何使用列表的部分。

关于java - JList 覆盖单元格的 toString 以正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19521867/

相关文章:

Java Swing 列表

java - 向 JList 添加项目导致 java.lang.NullPointerException

Java数组正在被重写:(

Java文件路径作为目录路径

java - 我在 lambda 表达式中找不到结果

java - 如何更改未选中的 JList 项目的背景颜色?

java - 在 Tomcat 6 上以特定顺序加载 Jar 文件

Java:处理重写方法中的语句

c++ - 为什么这个 C++ 继承代码示例的行为是这样的

php - 重写 PHP 中的方法?