从Objects的ArrayList创建JTable - Java

时间:2013-09-21 01:53:07

标签: java swing arraylist jtable tablemodel

如何在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);

看起来应该是这样的:

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

真的......

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

我不想使用2D Object [] [],因为将它们作为Click对象保留得更有意义。

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

我想请一个快速简单的例子(java文档有点令人困惑)。

2 个答案:

答案 0 :(得分:7)

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

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

这个例子不可变。也就是说,您无法添加或删除新点击或更改现有点击。这并不困难,您应该通过How to use tables阅读更多详细信息

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;
        }            
    }        
}

答案 1 :(得分:1)

  

将它们保持为Click对象更有意义。

当您想要在表格中显示其他自定义对象时,可能还会出现其他情况。 Row Table Model为对象的ArrayList提供了通用支持。它为添加和删除等动态功能提供支持。

JButtonTableModel.java给出了实现Object完整模型所需代码的示例。