从 JTable 中的单元格获取值

Get value from a cell in JTable

我到处都看过,但似乎无法弄清楚。我只想在用户单击时从我的 JTable 中提取单元格的值。

但是目前我得到的是 -1,所以我想双击结果不会检测到任何行。这是代码:

import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import javax.swing.*;
import javax.swing.table.TableColumn;

public class CardLayoutExample {
    private static JScrollPane scrollPane;

  public static void main(String[] arguments) throws SQLException {

    // main window
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame window = new JFrame("CardLayout Example");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setSize(1500,800); 
    window.getContentPane().setLayout(new BorderLayout());



final CardLayout cardLayout = new CardLayout(); 
final JPanel cardPanel = new JPanel(cardLayout);

JPanel card3 = new JPanel();
cardPanel.add(card3,"All Patients");

String AllPatients="select * from tblPtDetails";
    JTable tablePatientDt = new   JTable(Bquery.buildTableModel(Bquery.resultQuery(AllPatients)));
    tablePatientDt.setEnabled(false);
    tablePatientDt.setPreferredScrollableViewportSize(new Dimension(1200, 400));
    tablePatientDt.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); 
    tablePatientDt.setRowHeight(30);
    tablePatientDt.setAutoCreateRowSorter(true);
    card3.add(tablePatientDt);
    card3.add(new JScrollPane(tablePatientDt), BorderLayout.CENTER);
    for (int i = 0; i < (tablePatientDt.getColumnCount()); i++) {
        TableColumn columnPatients = null;
        columnPatients = tablePatientDt.getColumnModel().getColumn(i);
        columnPatients.setPreferredWidth(70); //sport column is bigger

    }
    tablePatientDt.addMouseListener(new MouseAdapter() {
           public void mouseClicked(MouseEvent e) {
              if (e.getClickCount() == 2) {
                 int row = tablePatientDt.getSelectedRow();
                 int column = tablePatientDt.getSelectedColumn();
                 //Object val= tablePatientDt.getModel().getValueAt(row, column);
                 //tablePatientDt.getModel().getValueAt(row, column);
                 //return tablePatientDt.getModel().getValueAt(row, column);
                 System.out.println(row);
                 JFrame newFrame = new JFrame();
                 newFrame.setTitle("Detail Screen");
                 newFrame.setVisible(true);
                 }
           }
        });

你的主要问题在这里:

tablePatientDt.setEnabled(false);

由于未启用table,因此无法选择任何单元格或行,因此所选行将始终为-1。解决方案:摆脱那条线。相反,如果您不希望某个单元格在双击时成为 editable,请覆盖 JTable 或其模型并覆盖 isCellEditable 方法:

例如,

// create your JTable model here:
DefaultTableModel model = ......

JTable tablePatientDt = new JTable(model){
@Override
public boolean isCellEditable(int row, int column) {
    return false;
}

其他问题:不要将 JTable 添加到多个组件中。这意味着很大的麻烦风险,因为 Swing 组件一次只能添加到一个组件。

附带建议:在您以后的问题中 post 只有小型可编译和 运行 可用的程序。您上面的代码不能 运行 因为它具有我们无法访问的数据库依赖项,而且也不完整。为了找到你的问题,我不得不用你的代码创建一个小的 运行nable 程序,一个 mcve(请阅读 link):

import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class CardLayoutExample {
    private static JScrollPane scrollPane;

    public static void main(String[] arguments) throws SQLException {

        // main window
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame window = new JFrame("CardLayout Example");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // !! window.setSize(1500, 800);
        window.getContentPane().setLayout(new BorderLayout());

        final CardLayout cardLayout = new CardLayout();
        final JPanel cardPanel = new JPanel(cardLayout);

        JPanel card3 = new JPanel();
        cardPanel.add(card3, "All Patients");

        String AllPatients = "select * from tblPtDetails";

        //!!  
        String[][] data = {{"1", "2", "3"}, {"4", "5", "6"}, {"7", "8", "9"}};
        String[] columnNames = {"One", "Two", "Three"};
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        // !! JTable tablePatientDt = new JTable(Bquery.buildTableModel(Bquery.resultQuery(AllPatients)));
        JTable tablePatientDt = new JTable(model){
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };

        // !! tablePatientDt.setEnabled(false);
        tablePatientDt.setPreferredScrollableViewportSize(new Dimension(1200, 400));
        tablePatientDt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        tablePatientDt.setRowHeight(30);
        tablePatientDt.setAutoCreateRowSorter(true);
        // !! card3.add(tablePatientDt);
        card3.add(new JScrollPane(tablePatientDt), BorderLayout.CENTER);
        for (int i = 0; i < (tablePatientDt.getColumnCount()); i++) {
            TableColumn columnPatients = null;
            columnPatients = tablePatientDt.getColumnModel().getColumn(i);
            columnPatients.setPreferredWidth(70); // sport column is bigger

        }
        tablePatientDt.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    int row = tablePatientDt.getSelectedRow();
                    int column = tablePatientDt.getSelectedColumn();
                    // Object val= tablePatientDt.getModel().getValueAt(row,
                    // column);
                    // tablePatientDt.getModel().getValueAt(row, column);
                    // return tablePatientDt.getModel().getValueAt(row, column);
                    System.out.println(row);
                    JFrame newFrame = new JFrame();
                    newFrame.setTitle("Detail Screen");
                    newFrame.setVisible(true);
                }
            }
        });

        //!! 
        window.add(cardPanel);
        window.pack();
        window.setVisible(true);
    }
}

但实际上这项工作应该是你的而不是我的,因为我们都是志愿者,而你是寻求志愿者帮助解决问题的人。因此,将来我们要求您创建自己的 mcve 来回答您的问题。

此外,该细节 window 不应是 JFrame,而应是 JDialog。