2014-11-21 72 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); 
    } 
}); 

希望這可以幫助...