如何更新JTable?

时间:2016-03-09 03:04:54

标签: java swing jtable

我正在为我的高中编程班创造基本上优秀的东西。我希望用户能够选择一个单元格,在01/01/00表单中键入日期,按回车键,然后将单元格更新为显示2000年1月1日。

客户是

package client;

import javax.swing.JFrame;
import spreadsheet.GUI;

public class Program {
    public static void main(String[] args) {
        GUI gui = new GUI();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(1000, 618);
        gui.setVisible(true);
    }

}

JTable类是

package spreadsheet;

import java.awt.BorderLayout;
import java.awt.Component;

import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;

import cell.*;

public class GUI extends JFrame implements TableModelListener {

    JTable mainTable;
    TableModel dtm;

    public static final int ASCII_SHIFT = 64;

    public GUI() {

        super("TextExcel");
        setLayout(new BorderLayout());

        String[] letter = new String[7];
        for (int i = 0; i < letter.length; i++) {
            byte[] character = {(byte) (i + ASCII_SHIFT + 1)};
            letter[i] = new String(character);
        }

        Cell[][] sheet = new Cell[10][8];

        mainTable = new JTable(sheet, letter);

        JTableHeader header = mainTable.getTableHeader();
        header.setDefaultRenderer(new HeaderRenderer(mainTable));

        dtm = mainTable.getModel();

        for (int i = 0; i < sheet.length; i++) {
            mainTable.setRowHeight(i, 35);
        }

        JScrollPane scrollPane = new JScrollPane(mainTable);
        JTable rowTable = new RowNumberTable(mainTable);
        scrollPane.setRowHeaderView(rowTable);

        scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, rowTable.getTableHeader());
        mainTable.setFillsViewportHeight(true);

        add(scrollPane);
        }

    private static class HeaderRenderer implements TableCellRenderer {

        DefaultTableCellRenderer renderer;

        public HeaderRenderer(JTable table) {
            renderer = (DefaultTableCellRenderer)
            table.getTableHeader().getDefaultRenderer();
            renderer.setHorizontalAlignment(JLabel.CENTER);
        }

        @Override
        public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int col) {
            return renderer.getTableCellRendererComponent(
                    table, value, isSelected, hasFocus, row, col);
        }
    }

    @Override
    public void tableChanged(TableModelEvent e) {
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object data = model.getValueAt(row, column);
    }

}

Cell类是

package cell;

public abstract class Cell {

    public abstract String toString();

}

DateCell类是

package cell;

public class DateCell extends Cell{

    private int month, day, year;
    public static final String[] MONTH = {"January", "February", "March", "April", "May",
            "June", "July", "August", "September", "October", "November", "December"};

    public DateCell(int month, int day, int year) {
        this.month = month;
        this.day = day;
        this.year = year;
    }

    public DateCell(String s) {
        int firstSlash = s.indexOf('/');
        int secondSlash = s.lastIndexOf('/');
        month = Integer.parseInt(s.substring(0, firstSlash));
        day = Integer.parseInt(s.substring(firstSlash + 1, secondSlash));
        if (s.substring(secondSlash + 1).length() < 4) {
            year = Integer.parseInt(s.substring(secondSlash + 1)) + 2000;
        } else {
            year = Integer.parseInt(s.substring(secondSlash + 1));
        }
    }

    public String toString() {
        return MONTH[month-1] + " " + day + ", " + year;
    }
}

我最终会有其他的Cell子类,但我现在只使用DateCell。

我想我的主要问题是如何将用户输入处理成可编辑的单元格,在我的情况下修改Object [] [](或Cell [] []),并让表刷新以显示数据变化?

我已经查看了关于JTables的官方java教程和几个关于更新的堆栈溢出帖子,但我仍然不知道如何将它放入我的代码中。

1 个答案:

答案 0 :(得分:0)

将表模型放入默认表模型参考中。像这样。

DefaultTableModel dtm = (Default Table Model)jtable.getModel();

然后在表格中更新很容易。