【问题标题】:How to copy one row from JTable into another JTable如何将一行从 JTable 复制到另一个 JTable
【发布时间】:2019-11-21 14:00:34
【问题描述】:

我在我的项目上工作,我需要将一行从 JTable 复制到另一个 JTable 中,第二个 JTable 应该只是单行表。我为第一个 JTable 创建了 mouselistener,在双击时它应该复制行并将其插入另一个 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);

【问题讨论】:

  • 如果您的第二个模型只需要一行,那么为什么不为JTable 创建一个新的TableModel,而不是向现有模型添加新行?
  • 感谢您的回答!我在编程方面并不资深,我正在努力做到最好! :) 我需要在两者中保留行,我需要稍后将它从第二个 JTable 复制到第三个 JTable :) 还有一个问题,我如何限制 JTable 只显示一行?
  • 每次需要将行复制到第二个表时,在第二个表中使用一个新的TableModel
  • 感谢您的宝贵时间!在我修复它之前,我似乎必须阅读一些关于 TableModel 的信息:D
  • @MadProgrammer 我编辑了代码,你能看一下吗?

标签: java postgresql swing jtable mouseevent


【解决方案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);
                            }
                        }
                    }
                }
            });
        }

    }

}

【讨论】:

  • 但这会从一开始复制整个模型并将其放入另一个模型中,对吗?我只需要获取一行(我无法尝试,因为我无法使用它:Object row = data.get(row);
  • 不行,应该是复制一个,为什么不能用Object row = data.get(row);
  • 我收到错误:Vector 类型中的方法 get(int) 不适用于参数(Object)这是我的制作方法:imgur.com/a/EwJt1 编辑:我也使用了 int row = cputable .getSelectedRow();但没有结果
  • 部分问题是您使用的是MouseListener,它可能会在选择更新之前触发,因此getSelectedRow 可能会返回“最后”选定的行(不是关于被选中)。您可能需要使用JTable#rowAt 并将MosueEvent#getPoint 值传递给它
  • 它几乎可以工作,当我尝试 .setmodel(model2) 时仍然没有任何反应,但是如果我尝试从 newData 打印行,我可以得到它们,但正如他们所说的那样,它们不会将其插入 Jtable .我希望我使用 DbUtils 它不会让它变坏?
【解决方案2】:

1.我们制作餐桌的第一类代码-->

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.我们必须获取最后一个表数据的第二类代码-->

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

      }
    });
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多