Java 读取jtable选定行的值

Java 读取jtable选定行的值,java,swing,jtable,listselectionlistener,Java,Swing,Jtable,Listselectionlistener,我正在使用JavaRMI和swing,我已经从数据库中读取了值,但是我无法读取代码中所选行的值。我想要显示的是,JTable显示所有数据库,它显示服务器中所有可用的数据库,但我无法读取该行中的选定行值 软件包客户端 import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.*;

我正在使用JavaRMI和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;
    }
}
import javax.swing.*;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
导入javax.swing.table.*;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.*;
导入schoolserver.SchoolInterface;
公共类数据库列表{
JFrame JFrame=null;
JPanel JPanel=null;
JList JList=null;
JTable JTable=null;
字符串数据=null;
schoolserver.SchoolInterface schoolInt=null;
公共数据库列表(学校界面sii){
schoolInt=sii;
jFrame=新的jFrame();
jTable=新的jTable(){
公共布尔值isCellEditable(int行,int列){
返回false;
}
};
setModel(createTable());
jTable.setSelectionMode(ListSelectionModel.SINGLE_选择);
jTable.addMouseListener(新的MouseAdapter(){
公共无效MouseClicked(MouseEvent e){
if(SwingUtilities.isLeftMouseButton(e)&&(e.getClickCount()==2)){
新建createListSelection();
}
}
});
JScrollPane scrollPane=新的JScrollPane(jTable);
添加(滚动窗格);
jFrame.setSize(200200);
jFrame.setVisible(true);
}
私有DefaultTableModel createTable(){
DefaultTableModel dtm=新的DefaultTableModel();
addColumn(“数据库”,createArray());
返回dtm;
}
私有类createListSelection实现ListSelectionListener{
@凌驾
public void值已更改(ListSelectionEvent e){
如果(!e.getValueIsAdjusting()){
ListSelectionModel lsm=jTable.getSelectionModel();
数据=(字符串)jTable.getValueAt(jTable.getSelectedRow(),0);
系统输出打印项次(数据);
}
}
}
对象[]createArray(){
ArrayList al=null;
对象[]x=null;
试试{
al=schoolInt.availableDatabases();
x=新对象[al.size()];
int i=0;
对于(对象o:schoolInt.availableDatabases())
x[i++]=o;
}
捕获(例外e){
JOptionPane.showMessageDialog(null,“未连接到数据库或”
+“远程服务器可用”,“服务器信息”,JOptionPane.OK_选项);
}
返回x;
}
}

你看起来把事情复杂化了。不要在监听器中重新添加监听器,只需向JTable添加一个监听器,一个鼠标监听器,然后添加一次。在它里面检查双击(按下)并响应。比如:

    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不是您想要的。在这种情况下,只有一个鼠标听器才能工作
  • 一定要阅读适当的教程,因为他们会很好地解释所有这些。请检查标签中的链接
      你看起来把事情复杂化了。不要在监听器中重新添加监听器,只需向JTable添加一个监听器,一个鼠标监听器,然后添加一次。在它里面检查双击(按下)并响应。比如:

          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不是您想要的。在这种情况下,只有一个鼠标听器才能工作
      • 一定要阅读适当的教程,因为他们会很好地解释所有这些。请检查标签中的链接
      为什么要从侦听器中创建侦听器?这看起来有点不对劲。为什么不将侦听器添加到JTable中一次,然后对其进行响应?您能告诉我如何处理此代码吗?否--我无法运行此代码,因为它需要我没有的资源。但是,请再次解释为什么您的代码是以这种奇怪的方式编写的——您正在尝试做什么。考虑编辑您的代码,使其放入虚拟数据,我们可以自己编译和运行。