我编写了很少的访问时间表.它基于JTable,自定义TableModel扩展AbstractTableModel,如下图所示.
问题是可以初始化表并获得所需的外观 - 但在使用数据更改后setValueAt()
,表的外观没有变化.按钮单击获取示例字符串并在9:00设置"类型"和"状态"列中的字段(更准确地说,取决于给定的小时和预订日期)
更重要的是,我能够在表的末尾插入新行,但无法使可见的现有值更新.尝试了许多解决方案,但遗憾的是没有结果.我会非常感谢每一个建议.
说明问题的工作代码:
import java.awt.EventQueue; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class ModelTest { private JFrame frame; private JTable tablePendingVisits; private PendingVisitModel pendingVisitModel; private JScrollPane scrollPanePendingVisits; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { ModelTest window = new ModelTest(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public ModelTest() { frame = new JFrame(); frame.setBounds(100, 100, 450, 407); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(null); JButton btnChangeValue = new JButton("Change value at 9:00"); btnChangeValue.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { refreshTableModel(); } }); btnChangeValue.setBounds(63, 308, 305, 23); frame.getContentPane().add(btnChangeValue); tablePendingVisits = new JTable(); scrollPanePendingVisits = new JScrollPane(); pendingVisitModel = new PendingVisitModel(); tablePendingVisits.setModel(pendingVisitModel); scrollPanePendingVisits.setBounds(63, 36, 305, 246); scrollPanePendingVisits.setViewportView(tablePendingVisits); frame.getContentPane().add(scrollPanePendingVisits); } public void refreshTableModel(){ String[] sampleString = {"9:00", "Bobby", "Tables"}; // search for row with 9:00 and replace values in given columns for (int i = 0; i < pendingVisitModel.getRowCount(); i++) { if( sampleString[0].equals(pendingVisitModel.getValueAt(i, 0)) ) { // Change row values when both hours are equal pendingVisitModel.setValueAt(sampleString[1], i, 1); // Change at type column pendingVisitModel.setValueAt(sampleString[2], i, 2); // Change at status column } } } } // Custom TableModel class PendingVisitModel extends AbstractTableModel { private static final long serialVersionUID = 1L; private String[] columnNames = {"HOUR", "TYPE", "STATE"}; private Vectordata = new Vector (); public PendingVisitModel() { for(int i = 8; i<15; i++) { data.add(new String[]{i+":00", "-", "Free"} ); data.add(new String[]{i+":15", "-", "Free"} ); data.add(new String[]{i+":30", "-", "Free"} ); data.add(new String[]{i+":45", "-", "Free"} ); } } public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.size(); } public String getColumnName(int col) { return columnNames[col]; } public String getValueAt(int row, int col) { String[] temp = data.get(row); if(temp.length > 0 && col < 3) return temp[col]; else return null; } public void setValueAt(String[] value, int row, int col) { String[] temp = data.get(row); temp[col] = value[col]; data.set(row, temp); fireTableRowsUpdated(row, row); } public void insertRow(String[] value) { data.add(value); fireTableRowsInserted(data.size(), data.size()); } public void clearRows(){ data.clear(); fireTableDataChanged(); } public void removeAllEntry(){ data.clear(); fireTableDataChanged(); } public boolean isCellEditable(int row, int col) { return false; } @Override public Class getColumnClass(int colNum) { return String.class; } }
MadProgramme.. 5
public void setValueAt(String[] value, int row, int col) {
和之间有区别public void setValueAt(Object value, int row, int col) {
您可以使用@Override
注释来测试它,例如......
@Override public void setValueAt(String[] value, int row, int col) {
生成编译器错误,其中as
@Override public void setValueAt(Object value, int row, int col) {
才不是.
所以将setValueAt
方法改为......
@Override public void setValueAt(Object value, int row, int col) { if (value instanceof String) { String[] temp = data.get(row); temp[col] = value.toString(); data.set(row, temp); fireTableRowsUpdated(row, row); } }
工作只是找到我
此外,你真的应该避免使用null
布局,像素完美的布局是现代ui设计中的错觉.影响组件个体大小的因素太多,您无法控制.Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的结束,您将花费越来越多的时间来纠正
正如评论中所指出的,你也可以使用public void setValueAt(String value, int row, int col) {
(没有覆盖注释)并且你的代码可以工作,但是我不会调用该方法,setValueAt
因为这会产生混淆(正如你所发现的那样),并且排除了你所拥有的只是一个场景的场景.的例子TableModel
public void setValueAt(String[] value, int row, int col) {
和之间有区别public void setValueAt(Object value, int row, int col) {
您可以使用@Override
注释来测试它,例如......
@Override public void setValueAt(String[] value, int row, int col) {
生成编译器错误,其中as
@Override public void setValueAt(Object value, int row, int col) {
才不是.
所以将setValueAt
方法改为......
@Override public void setValueAt(Object value, int row, int col) { if (value instanceof String) { String[] temp = data.get(row); temp[col] = value.toString(); data.set(row, temp); fireTableRowsUpdated(row, row); } }
工作只是找到我
此外,你真的应该避免使用null
布局,像素完美的布局是现代ui设计中的错觉.影响组件个体大小的因素太多,您无法控制.Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的结束,您将花费越来越多的时间来纠正
正如评论中所指出的,你也可以使用public void setValueAt(String value, int row, int col) {
(没有覆盖注释)并且你的代码可以工作,但是我不会调用该方法,setValueAt
因为这会产生混淆(正如你所发现的那样),并且排除了你所拥有的只是一个场景的场景.的例子TableModel