2013-01-11 139 views
0

當我在第一行「Units」和「Price」列的單元格中輸入值時,「Amount」列;列單元格值應設置爲單位和數量的乘積。我應該使用哪一位聽衆?請幫助,因爲我是Java新手。Java中JTable的兩個單元格之間的乘法

CODE:

JTable jTable1; 
DefaultTableModel mod=new DefaultTableModel(); 
     mod.addColumn("No"); 
     mod.addColumn("Item ID"); 
     mod.addColumn("Units"); 
     mod.addColumn("Amount"); 
     mod.addColumn("UOM"); 
     mod.addColumn("Delivery Date"); 
     mod.addColumn("Total Amount"); 
     mod.addColumn("Notes"); 
     mod.addColumn("Received"); 
     mod.addRow(new Object [][] { 
      {1, null, null, null, null, null, null, null, null} 
     }); 
     jTable1.setModel(mod); 
     jTable1.setColumnSelectionAllowed(true); 
+2

你可以嘗試創建一個自定義'DefaultTableModel'誰的['getValueAt(int,int)'](http://docs.oracle.com/javase/7/docs/api/javax/swing/table/DefaultTableModel.html#getValueAt%28int,%20int%29)列返回其他兩個單元的乘法結果。 –

回答

4

的想法是實施一個TableModel,以便它自動返回單位和金額的乘積的結果。這裏是我的意思(添加一個新行,只需雙擊見下表)小演示:

import java.awt.BorderLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.Vector; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 

public class TestTable3 { 

    protected void initUI() { 
     final DefaultTableModel model = new DefaultTableModel() { 

      @Override 
      public Class<?> getColumnClass(int columnIndex) { 
       switch (columnIndex) { 
       case 0: 
        return Integer.class; 
       case 1: 
       case 2: 
        return Double.class; 
       } 
       return super.getColumnClass(columnIndex); 
      } 

      @Override 
      public Object getValueAt(int row, int column) { 
       if (column == 2) { 
        Integer i = (Integer) getValueAt(row, 0); 
        Double d = (Double) getValueAt(row, 1); 
        if (i != null && d != null) { 
         return i * d; 
        } else { 
         return 0.0; 
        } 
       } 
       return super.getValueAt(row, column); 
      } 

      @Override 
      public boolean isCellEditable(int row, int column) { 
       return column == 0 || column == 1; 
      } 

      @Override 
      public void setValueAt(Object aValue, int row, int column) { 
       super.setValueAt(aValue, row, column); 
       fireTableCellUpdated(row, 2); 
      } 

      @Override 
      public String getColumnName(int column) { 
       switch (column) { 
       case 0: 
        return "Quantity"; 
       case 1: 
        return "Price"; 
       case 2: 
        return "Total"; 
       } 
       return super.getColumnName(column); 
      } 

      @Override 
      public int getColumnCount() { 
       return 3; 
      } 
     }; 
     final JTable table = new JTable(model); 
     table.setFillsViewportHeight(true); 
     table.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if (e.getClickCount() == 2) { 
        if (table.rowAtPoint(e.getPoint()) < 0) { 
         model.addRow(new Vector()); 
        } 
       } 
      } 
     }); 
     model.addRow(new Vector()); 
     JFrame frame = new JFrame(TestTable3.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JScrollPane scrollpane = new JScrollPane(table); 
     frame.add(scrollpane, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, 
      UnsupportedLookAndFeelException { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestTable3().initUI(); 
      } 
     }); 
    } 

} 

而結果: Result

+0

+1請將'返回Double.class;'也添加到'2nd case',或者使用默認語句:'返回Double.class;' – mKorbel

+0

@mKorbel它們都返回'Double.class'(case 1和情況2:'情況1: 情況2: 返回Double.class;')。案例1「跌入」案例2 –

+0

沒有問題,我的意見是關於論壇的代碼,請假 – mKorbel