2014-11-21 87 views
0

我一直在尝试通过直接输入来找到更新单元格的方法。从我reshearch,每个人都似乎是说,你必须使用无法从JTable更新单元格

myJTable.fireTableCellUpdated() 

Althought,它一直要求我投myJTable - >它不能被铸造成AbstractTableModel的是什么,从我的理解,是必要的。

这里是我的表当前的代码,如果使可能帮助:

myJTable= new JTable(); 

    myJTable.setModel(new DefaultTableModel(
     new Object[][] { 
      {null, null, null}, 
     }, 
     new String[] { 
      "Thing#1", "Thing#2", "Thing#3" 
     } 
    )); 

    myJTable.getModel().addTableModelListener(new TableModelListener() { 
     public void tableChanged(TableModelEvent e) { 
      myJTable.fireTableCellUpdated(e.getFirstRow(), e.getColumn()); 
      myJTable.repaint(tblCG.getCellRect(e.getFirstRow(), e.getColumn(), false)); 
      myJTable.putClientProperty("terminatedEditOnFocusLost", true); 
     } 
     }); 

怎么可能对我来说,从已经从用户更新通过直接输入单元格保存DATAS? 谢谢!

+0

'myJTable.fireTableCellUpdated()' - 没有,从来没有!您应该能够简单地使用'JTable#setValueAt'或'TableModel#setValueAt',并且如果'TableModel'配置正确,它应该自动通知表。你应该永远不要从类上下文中调用事件触发方法 – MadProgrammer 2014-11-21 01:07:39

+0

@MadProgrammer好的,如果我遵循你的逻辑,我应该这样做:'myJTable.setValueAt(??? getCellValue ???,e.getFirstRow(),e。 getColumn());' – MammouthQc 2014-11-21 01:12:29

回答

1

取决于你正在尝试做的,你可以使用...

例如...

enter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    private JTable myJTable; 

    private String values[] = {"Orange", "Green", "Blue", "Pink", "Yellow"}; 
    private int count; 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       myJTable = new JTable(); 

       myJTable.setModel(new DefaultTableModel(
           new Object[][]{{"Banana", "Yellow"}}, 
           new Object[]{"Fruit", "Color"} 
       )); 

       JButton change = new JButton("Change"); 
       change.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         count++; 
         String value = values[Math.abs(count % values.length)]; 
         myJTable.setValueAt(value, 0, 1); 
        } 

       }); 
       JButton add = new JButton("add"); 
       add.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         DefaultTableModel model = (DefaultTableModel) myJTable.getModel(); 
         model.addRow(new Object[]{"Apple " + model.getRowCount(), "Green"}); 
        } 

       }); 
       JButton delete = new JButton("delete"); 
       delete.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         int rowIndex = myJTable.getSelectedRow(); 
         rowIndex = myJTable.convertRowIndexToModel(rowIndex); 
         if (rowIndex > 0) { 
          DefaultTableModel model = (DefaultTableModel) myJTable.getModel(); 
          model.removeRow(rowIndex); 
         } 
        } 

       }); 

       JPanel actions = new JPanel(); 
       actions.add(change); 
       actions.add(add); 
       actions.add(delete); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(myJTable)); 
       frame.add(actions, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

您应该只需要调用的帮助fireXxx事件的方法之一,如果你以某种方式自行定制类,只能从类内部调用时,他们不应该被触发对外,这是我们的责任实现类要做到这一点

因此,没有额外的代码...

Editing

单元格编辑内置在默认情况下...

见...

了解更多详情...

+0

感谢您的awnsers![这就是我的意思](http://i.imgur.com/oSdFHeI.png?1)。当我点击图像中的“D3788”我应该能够把它编辑到别的...... 'Table.getModel()。addTableModelListener(新TableModelListener(){ \t \t \t公共无效tableChanged(TableModelEvent E) { \t \t \t \t如果(!建){ \t \t \t \t Table.setValueAt(Table.getModel()。getValueAt(e.getFirstRow(),e.​​getColumn()),e.getFirstRow(),E。 getColumn()); \t \t \t \t Table.repaint(Table.getCellRect(e.getFirstRow(),e.​​getColumn(),false)); \t \t \t \t Table.putClientProperty(“terminatedEditOnFocusLost”,true); \t \t \t \t} \t \t \t} \t \t \t}); ' – MammouthQc 2014-11-21 01:43:22

+0

对不起,能见度低,小评论。 该代码是表的代码。 建设是一个布尔值,以确保我不听节目输入。 执行此代码时,我看到一个看起来像死循环的崩溃。 – MammouthQc 2014-11-21 01:45:47

+0

它的工作原理是什么?默认的'TableCellEditor'应该自动处理... – MadProgrammer 2014-11-21 01:46:51

0

这里是我的建议(希望我的理解对不对这个问题):

  1. 我将宣布其传递给DefaultListModel作为类属性的数据字段。然后,您可以通过这些属性访问表格的对象。

  2. 我会在隐式构造函数中覆盖DefaultTableModel#setValueAt(Object, int, int)DefaultTableModel#getValueAt(int, int)

所以请尝试以下解决方案:

//declared as class attributes 
Object[][] data = {{null, null, null},}; 
String[] columns = {"Thing#1", "Thing#2", "Thing#3"}; 

/*...*/ 

table.setModel(new DefaultTableModel(data, columns) { 
    @Override 
    public Object getValueAt(int row, int col) { return data[row][col]; } 
    @Override 
    public void setValueAt(Object value, int row, int col) { 
     data[row][col] = value; 
     fireTableCellUpdated(row, col); 
    } 
}); 

希望这可以帮助...