从对象的 ArrayList 创建 JTable - Java

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18928112/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 12:35:34  来源:igfitidea点击:

Create JTable from ArrayList of Objects - Java

javaswingarraylistjtabletablemodel

提问by Connor

How do I display my "Click" objects in a JTable?

如何在 JTable 中显示我的“Click”对象?

ArrayList<Click> myClicks = new ArrayList<Click>();

Click click = new Click(620, 1028);
Click click2 = new Click(480, 230);

myClicks.add(click);
myClicks.add(click2);

It should look something like this:

它应该是这样的:

|---Mouse X---|---Mouse Y---|
|     620     |     1028    |
|     480     |      230    |

Which is really...

这是真的...

       |              |
       v              v
  click.getX()  click.getY()
  click2.getX() click2.getY()

I don't want to use a 2D Object[][] because it makes more sense to keep them as Click objects as long as possible.

我不想使用 2D Object[][] 因为尽可能长时间地将它们保留为 Click 对象更有意义。

I know I probably have to extend the TableModel interface but I'm not sure how.

我知道我可能必须扩展 TableModel 接口,但我不确定如何扩展。

I'd just like a quick and simple example please (the java docs are a little confusing).

我只想要一个快速简单的例子(java 文档有点混乱)。

采纳答案by MadProgrammer

You could use DefaultTableModel, but in your case, that would mean you need to convert your data to confirm to it's needs, better to define a model that supports you data model...that's kinda the point

您可以使用DefaultTableModel,但在您的情况下,这意味着您需要转换数据以确认其需求,最好定义一个支持您数据模型的模型......这就是重点

The following examples uses an AbstractTableModel, because it gives you control over the backing data, but takes care of most of the house keeping (registering and firing events).

以下示例使用AbstractTableModel,因为它使您可以控制后备数据,但负责大部分内务管理(注册和触发事件)。

The example is not mutable. That is, you can't add or delete new clicks or change existing clicks. It's not difficult to do and you should read through How to use tablesfor more details

这个例子是不可变的。也就是说,您无法添加或删除新点击或更改现有点击。这并不难,您应该阅读如何使用表格以获取更多详细信息

enter image description here

在此处输入图片说明

import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;

public class ClickTable {

    public static void main(String[] args) {
        new ClickTable();
    }

    public ClickTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                List<Click> clicks = new ArrayList<>(25);
                clicks.add(new Click(620, 1028));
                clicks.add(new Click(480, 230));
                ClickTableModel model = new ClickTableModel(clicks);
                JTable table = new JTable(model);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Click {

        private int x;
        private int y;

        public Click(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

    }

    public class ClickTableModel extends AbstractTableModel {

        private List<Click> clicks;

        public ClickTableModel(List<Click> clicks) {
            this.clicks = new ArrayList<>(clicks);
        }

        @Override
        public int getRowCount() {
            return clicks.size();
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public String getColumnName(int column) {
            String name = "??";
            switch (column) {
                case 0:
                    name = "Mouse X";
                    break;
                case 1:
                    name = "Mouse Y";
                    break;
            }
            return name;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            Class type = String.class;
            switch (columnIndex) {
                case 0:
                case 1:
                    type = Integer.class;
                    break;
            }
            return type;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Click click = clicks.get(rowIndex);
            Object value = null;
            switch (columnIndex) {
                case 0:
                    value = click.getX();
                    break;
                case 1:
                    value = click.getY();
                    break;
            }
            return value;
        }            
    }        
}

回答by camickr

it makes more sense to keep them as Click objects as long as possible.

尽可能将它们作为 Click 对象保留更有意义。

And there will probably be other cases when you want to display other custom Objects in a table as well. The Row Table Modelprovides generic support for an ArrayList of Objects. It provides support for dynamic functions like add and delete.

当您还想在表格中显示其他自定义对象时,可能还会有其他情况。所述行表模型提供了一种用于对象的ArrayList通用支持。它提供对添加和删除等动态功能的支持。

The JButtonTableModel.javagives and example of the code necessary to implement the full model for an Object.

JButtonTableModel.java为对象实现完整模型所需的代码的给出和示例。