2017-03-13 55 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

相关问题