2017-03-13 57 views
1

我在我的項目中工作,需要將JTable的一行復制到另一個JTable中,第二個JTable應該只是一行表。我創建了第一個JTable的mouselistener,在雙擊它應該複製行並插入到另一個JTable但它不能正常工作,任何想法如何解決它?我從第一個表中的數據庫獲取數據。與代碼:如何將一行從JTable複製到另一個JTable中

public void cputable() { 
    try { 
     conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/test","postgres","postgres"); 
     stat = conn.createStatement(); 
     result = stat.executeQuery("SELECT name,bus_speed,socket,cores,chipset,price*1.3 FROM CPU"); 

     cputable.setModel(DbUtils.resultSetToTableModel(result)); 
     result.close(); 
     stat.close(); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

,這裏是我嘗試複製一行代碼:

cputable.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent me) { 
       JTable cputable =(JTable) me.getSource(); 
       int row = cputable.getSelectedRow(); 
       int col = cputable.getColumnCount(); 

       if (me.getClickCount() == 2) { 
        cputablebottom.repaint(); 
        for(int i = 0; i < col; i++) { 
         DefaultTableModel model = (DefaultTableModel) cputable.getModel(); 
         List<String>list = new ArrayList<String>(); 
         list.add(cputable.getValueAt(row, i).toString()); 
         model.addRow(list.toArray()); 
         cputablebottom.setModel(model); 
         } 

結果前後:

編輯:

我重拍了一下的代碼,現在它複製整個列表而不是隻有一行。

cputable.addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent me) { 
      JTable cputable =(JTable) me.getSource(); 
      int row = cputable.getSelectedRow(); 
      int col = cputable.getColumnCount(); 

      if (me.getClickCount() == 2) { 
       cputablebottom.repaint(); 
       DefaultTableModel model1 = (DefaultTableModel) cputable.getModel(); 
       List<String>list = new ArrayList<String>(); 

       model1.addRow(list.toArray()); 
       for(int i = 0; i < col; i++) { 
        list.add(cputable.getValueAt(row, i).toString()); 
        cputablebottom.setModel(model1); 
        System.out.println(model1); 
        System.out.println(list); 
        } 
       cputablebottom.setModel(model1); 
+0

如果第二個模型只需要一行,那麼爲什麼不爲JTable創建一個新的'TableModel',而不是向現有模型添加新行? – MadProgrammer

+0

感謝您的回答!我在編程方面並不高級,並且盡我所能! :)我需要保持在兩個行,我需要從第二個JTable複製它到第三JTable :)也側面的問題,我怎麼能限制JTable只顯示一行? – Mercy

+0

每次需要複製一行時,在第二個表中使用一個新的'TableModel' – MadProgrammer

回答

1

我沒有嘗試過這一點,但...

DefaultTableModel model1 = (DefaultTableModel) cputable.getModel(); 
Vector data = model1.getDataVector(); 
Object rowObj = data.get(row); 

Vector newData = new Vector(1); 
newData.add(rowObj); 

DefaultTableModel model2 = (DefaultTableModel) cputablebottom.getModel(); 
model2.setRowCount(0); 
model2.addRow(newData); 

這應該保留第二個表的列信息。

或者,你可以創建一個新DefaultTableModel,但你必須每次

重新配置列的信息,我建議你做什麼是有JavaDocs for DefaultTableModel

測試例的讀取

我經常不會使用DefaultTableModel,我更喜歡在每一行放置一個實際的物體,然後我可以定義它是如何顯示的,這將使它通常更簡單,但是,如果您只有DefaultTableModel ...

import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.Vector; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 

public class Test { 

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

    public Test() { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Test"); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JTable top; 
     private JTable bottom; 

     public TestPane() { 
      setLayout(new GridLayout(2, 0)); 

      String[][] rowData = new String[10][10]; 
      for (int row = 0; row < 10; row++) { 
       String[] data = new String[10]; 
       for (int col = 0; col < 10; col++) { 
        data[col] = row + "x" + col; 
       } 
       rowData[row] = data; 
      } 
      String[] names = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; 
      DefaultTableModel model = new DefaultTableModel(rowData, names); 
      top = new JTable(model); 
      add(new JScrollPane(top)); 

      DefaultTableModel emptyModel = new DefaultTableModel(new String[10][10], names); 
      bottom = new JTable(emptyModel); 
      add(new JScrollPane(bottom)); 

      top.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        if (SwingUtilities.isLeftMouseButton(e)) { 
         int row = top.rowAtPoint(e.getPoint()); 
         if (row > -1) { 
          DefaultTableModel topModel = ((DefaultTableModel)top.getModel()); 
          DefaultTableModel bottomModel = ((DefaultTableModel)bottom.getModel()); 
          bottomModel.setRowCount(1); 
          for (int col = 0; col < topModel.getColumnCount(); col++) { 
           bottomModel.setValueAt(topModel.getValueAt(row, col), 0, col); 
          } 
         } 
        } 
       } 
      }); 
     } 

    } 

} 
+0

但是,這從第一個複製整個模型,並把它放在另一個,對不對?我需要只有一行(我不能嘗試它,因爲我不能使用它:對象行= data.get(row); – Mercy

+0

不,它應該複製一個單一的,爲什麼你不能使用'對象行=數據.get(row);'? – MadProgrammer

+0

即時通訊錯誤:類型向量中的方法get(int)不適用於參數 (Object) 這裏是我如何做到的: http://imgur.com/ a/EwJt1 編輯:我也用int row = cputable.getSelectedRow(); 但沒有結果 – Mercy

相關問題