如何将一行从 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) {
}
});
}
}
我在我的项目上工作,我需要将一行从 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) {
}
});
}
}