简体   繁体   English

如何更新JTable?

[英]How do I update a JTable?

I am creating what is basically excel for my high school programming class. 我正在为我的高中编程课程创建基本精通的软件。 I would like for the user to be able to select a cell, type in a date in the form 01/01/00, press enter, and have the cell be updated to show January 1, 2000. 我希望用户能够选择一个单元格,以01/01/00的形式键入日期,按Enter键,并使该单元格更新为显示2000年1月1日。

The client is 客户是

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

}

The JTable class is 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);
    }

}

The Cell class is Cell类是

package cell;

public abstract class Cell {

    public abstract String toString();

}

And the DateCell class is 而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;
    }
}

I will have other Cell subclasses eventually, but I am only using DateCell at the moment. 最终我将拥有其他Cell子类,但此刻我仅使用DateCell。

I suppose my main question is how do I process user input into an editable cell, modify the Object[][] (or Cell[][] in my case), and have the table refresh to show the data change? 我想我的主要问题是如何处理用户输入到可编辑单元格中的内容,如何修改Object [] [](在我的情况下为Cell [] []),并刷新表以显示数据更改?

I have viewed the official java tutorial on JTables and several stack overflow posts on updating, but I still do not know how to put that into my code. 我已经查看了有关JTables的官方Java教程以及有关更新的一些堆栈溢出文章,但我仍然不知道如何将其放入代码中。

Get your table model in to default table model reference. 将您的表模型放入默认表模型参考中。 Like this. 像这样。

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

Then it's easy to update in table. 然后很容易在表中更新。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM