我正在为我的高中编程班创造基本上优秀的东西。我希望用户能够选择一个单元格,在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教程和几个关于更新的堆栈溢出帖子,但我仍然不知道如何将它放入我的代码中。
答案 0 :(得分:0)
将表模型放入默认表模型参考中。像这样。
DefaultTableModel dtm = (Default Table Model)jtable.getModel();
然后在表格中更新很容易。