[英]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.