读取 jtable 选定行的值
reading the value of jtable selected row
我正在使用 java RMI 和 swing,我已经从数据库中读取了值,但是我无法读取此代码中选定行的值。我想让 JTable 显示所有数据库,它显示服务器中所有可用的数据库,但我无法读取此
中的选定行值
包校客户端;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.*;
import schoolserver.SchoolInterface;
public class DatabaseList {
JFrame jFrame = null;
JPanel jPanel = null;
JList jList = null;
JTable jTable = null;
String data = null;
schoolserver.SchoolInterface schoolInt = null;
public DatabaseList(SchoolInterface sii) {
schoolInt = sii;
jFrame = new JFrame();
jTable = new JTable(){
public boolean isCellEditable(int row, int column) {
return false;
}
};
jTable.setModel(createTable());
jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jTable.addMouseListener(new MouseAdapter() {
public void MouseClicked(MouseEvent e) {
if(SwingUtilities.isLeftMouseButton(e) && (e.getClickCount() == 2)) {
new createListSelection();
}
}
});
JScrollPane scrollPane = new JScrollPane(jTable);
jFrame.add(scrollPane);
jFrame.setSize(200, 200);
jFrame.setVisible(true);
}
private DefaultTableModel createTable() {
DefaultTableModel dtm = new DefaultTableModel();
dtm.addColumn("Databases", createArray());
return dtm;
}
private class createListSelection implements ListSelectionListener {
@Override
public void valueChanged(ListSelectionEvent e) {
if(!e.getValueIsAdjusting()) {
ListSelectionModel lsm = jTable.getSelectionModel();
data = (String) jTable.getValueAt(jTable.getSelectedRow(), 0);
System.out.println(data);
}
}
}
Object[] createArray() {
ArrayList<Object> al = null;
Object[] x = null;
try {
al = schoolInt.availableDatabases();
x = new Object[al.size()];
int i = 0;
for(Object o : schoolInt.availableDatabases())
x[i++] = o;
}
catch(Exception e) {
JOptionPane.showMessageDialog(null, "no connection to database or "
+ "remote server availabe", "Server Information", JOptionPane.OK_OPTION);
}
return x;
}
}
你看起来把事情复杂化了。不要在一个侦听器中重新添加侦听器,而是简单地向 JTable 添加一个侦听器,一个 MouseListener,并添加一次。在其中检查双击(按下)并响应。类似于:
jTable.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) {
data = (String) jTable.getValueAt(jTable.getSelectedRow(), 0);
System.out.println(data);
}
}
});
其他问题,您在 MouseAdapter 中的方法永远不会被调用,永远:
jTable.addMouseListener(new MouseAdapter() {
public void MouseClicked(MouseEvent e) {
// ....
}
});
您的大小写错误,并且由于 MouseAdapter/MouseListener 没有 MouseClicked 方法(它是 mouseClicked
),因此永远不会调用该方法。始终将 @Override
注释放在您认为 可能 被覆盖的任何方法之上,如果不是这样,让编译器警告您。如果你这样做了,你会得到编译器的提示警告。
关于您的评论
- 永远不要向 JTable 添加选择侦听器。再次,MouseAdapter 中的方法永远不会被调用,因为它的大写字母不正确
- 就算调用了,重复加一个ListSelectionListener有什么用?
- 如果您的目标是仅响应双击,那么 ListSelectionListener 不是您想要的。只有 MouseListener 可以在这种情况下工作。
- 一定要阅读相应的教程,因为它们对所有这些都进行了很好的解释。请查看 Swing Info 标签中的链接。
我正在使用 java RMI 和 swing,我已经从数据库中读取了值,但是我无法读取此代码中选定行的值。我想让 JTable 显示所有数据库,它显示服务器中所有可用的数据库,但我无法读取此
中的选定行值包校客户端;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.*;
import schoolserver.SchoolInterface;
public class DatabaseList {
JFrame jFrame = null;
JPanel jPanel = null;
JList jList = null;
JTable jTable = null;
String data = null;
schoolserver.SchoolInterface schoolInt = null;
public DatabaseList(SchoolInterface sii) {
schoolInt = sii;
jFrame = new JFrame();
jTable = new JTable(){
public boolean isCellEditable(int row, int column) {
return false;
}
};
jTable.setModel(createTable());
jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jTable.addMouseListener(new MouseAdapter() {
public void MouseClicked(MouseEvent e) {
if(SwingUtilities.isLeftMouseButton(e) && (e.getClickCount() == 2)) {
new createListSelection();
}
}
});
JScrollPane scrollPane = new JScrollPane(jTable);
jFrame.add(scrollPane);
jFrame.setSize(200, 200);
jFrame.setVisible(true);
}
private DefaultTableModel createTable() {
DefaultTableModel dtm = new DefaultTableModel();
dtm.addColumn("Databases", createArray());
return dtm;
}
private class createListSelection implements ListSelectionListener {
@Override
public void valueChanged(ListSelectionEvent e) {
if(!e.getValueIsAdjusting()) {
ListSelectionModel lsm = jTable.getSelectionModel();
data = (String) jTable.getValueAt(jTable.getSelectedRow(), 0);
System.out.println(data);
}
}
}
Object[] createArray() {
ArrayList<Object> al = null;
Object[] x = null;
try {
al = schoolInt.availableDatabases();
x = new Object[al.size()];
int i = 0;
for(Object o : schoolInt.availableDatabases())
x[i++] = o;
}
catch(Exception e) {
JOptionPane.showMessageDialog(null, "no connection to database or "
+ "remote server availabe", "Server Information", JOptionPane.OK_OPTION);
}
return x;
}
}
你看起来把事情复杂化了。不要在一个侦听器中重新添加侦听器,而是简单地向 JTable 添加一个侦听器,一个 MouseListener,并添加一次。在其中检查双击(按下)并响应。类似于:
jTable.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) {
data = (String) jTable.getValueAt(jTable.getSelectedRow(), 0);
System.out.println(data);
}
}
});
其他问题,您在 MouseAdapter 中的方法永远不会被调用,永远:
jTable.addMouseListener(new MouseAdapter() {
public void MouseClicked(MouseEvent e) {
// ....
}
});
您的大小写错误,并且由于 MouseAdapter/MouseListener 没有 MouseClicked 方法(它是 mouseClicked
),因此永远不会调用该方法。始终将 @Override
注释放在您认为 可能 被覆盖的任何方法之上,如果不是这样,让编译器警告您。如果你这样做了,你会得到编译器的提示警告。
关于您的评论
- 永远不要向 JTable 添加选择侦听器。再次,MouseAdapter 中的方法永远不会被调用,因为它的大写字母不正确
- 就算调用了,重复加一个ListSelectionListener有什么用?
- 如果您的目标是仅响应双击,那么 ListSelectionListener 不是您想要的。只有 MouseListener 可以在这种情况下工作。
- 一定要阅读相应的教程,因为它们对所有这些都进行了很好的解释。请查看 Swing Info 标签中的链接。