如何将一行从 JTable 复制到另一个 JTable

How to copy one row from JTable into another JTable

我在我的项目上工作,我需要将一行从 JTable 复制到另一个 JTable,第二个 JTable 应该只有一行 table。我为第一个 JTable 创建了 mouselistener,双击它应该复制行并将其插入另一个 JTable 但它不能正常工作,有什么解决办法吗?我首先从数据库中获取数据table。使用代码:

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);

我没试过,但是...

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);

这应该保留第二个table的列信息。

或者,您可以创建一个新的 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);
                            }
                        }
                    }
                }
            });
        }

    }

}

1.Code of 1st class 我们正在制作 table-->

Sell.java

public class Sell extends JFrame {
  public static void main(String args[]) {
    new Sell();
  }

  JTextField tf1, tf2, tf3;
  JButton b1, b2, b3;
  JTable t1;
  String s1;

  public Sell() {
    setBounds(450, 200, 600, 300);
    setTitle("Sell");
    Container con = getContentPane();
    con.setBackground(Color.WHITE);
    setLayout(null); // FlowLayout,GridLayout By default it is FlowLayout.
    setVisible(true);
    setResizable(false); // It allows to resize application size.
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    tf1 = new JTextField();
    tf2 = new JTextField();
    tf3 = new JTextField();
    b1 = new JButton("Select");
    b2 = new JButton("Add");
    b3 = new JButton("Invoice");
    t1 = new JTable(0, 2);
    DefaultTableModel model = (DefaultTableModel) t1.getModel();
    model.addRow(new Object[] { "Product", "Price" });

    add(tf1);
    add(tf2);
    add(tf3);
    add(b1);
    add(b2);
    add(b3);
    add(t1);

    tf1.setBounds(50, 50, 50, 20);
    tf2.setBounds(25, 100, 100, 20);
    tf3.setBounds(150, 100, 100, 20);
    b1.setBounds(150, 45, 75, 30);
    b2.setBounds(100, 195, 75, 30);
    b3.setBounds(200, 195, 75, 30);
    t1.setBounds(350, 50, 225, 200);

    b1.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {

        s1 = tf1.getText();

        try {
          Class.forName("com.mysql.cj.jdbc.Driver");
          Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/vanisb",
              "root", "spirit");
          Statement stmt = conn.createStatement();
          ResultSet rs = stmt.executeQuery("select * from product where ID='" + s1 + "';");

          while (rs.next()) {
            tf2.setText(rs.getString("product_name"));
            tf3.setText(rs.getString("price"));

          }
          conn.close();
        } catch (Exception ex) {
          JOptionPane.showMessageDialog(b1, ex);
        }
      }
    });

    b2.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {

        model.addRow(new Object[] { tf2.getText(), tf3.getText() });

      }
    });

    b3.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {

        new Invoice(model);
      }
    });
  }
}

2.Code of 2nd class 我们必须获取最后的 table 数据-->

Invoice.java

public class Invoice extends JFrame {

  public static void main(String[] args) {

  }

  JLabel l1, l2;
  JTextField tf1, tf2;
  JTable t2;
  JButton b1;

  public Invoice(DefaultTableModel model) {
    setBounds(450, 200, 600, 300);
    setTitle("Invoice");
    Container con = getContentPane();
    con.setBackground(Color.WHITE);
    setLayout(null);
    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    l1 = new JLabel("Name : ");
    l2 = new JLabel("Phone No. : ");
    tf1 = new JTextField();
    tf2 = new JTextField();
    b1 = new JButton("Add Customer");
    t2 = new JTable(model);

    add(l1);
    add(l2);
    add(tf1);
    add(tf2);
    add(b1);
    add(t2);

    l1.setBounds(50, 50, 100, 20);
    l2.setBounds(50, 100, 100, 20);
    tf1.setBounds(150, 50, 100, 20);
    tf2.setBounds(150, 100, 100, 20);
    b1.setBounds(100, 175, 150, 30);
    t2.setBounds(300, 50, 275, 200);

    b1.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent arg0) {

      }
    });
  }
}