Получить значение из ячейки в 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);
                 }
           }
        });

person Sebastian Zeki    schedule 10.04.2016    source источник


Ответы (1)


Ваша основная проблема здесь:

tablePatientDt.setEnabled(false);

Поскольку таблица не включена, ни одна ячейка или строка не могут быть выбраны, поэтому выбранная строка всегда будет равна -1. Решение: избавиться от этой строки. Вместо этого, если вы не хотите, чтобы ячейка редактировалась двойным щелчком, переопределите JTable или ее модель и переопределите метод isCellEditable:

e.g.,

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

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

Другие проблемы: не добавляйте JTable более чем к одному компоненту, как вы это делаете. Это означает большой риск возникновения проблем, поскольку компоненты Swing могут быть добавлены только к одному компоненту за раз.

Дополнительная рекомендация: в ваших будущих вопросах публикуйте только небольшие компилируемые и работающие программы. Ваш приведенный выше код не может быть запущен, так как он имеет зависимости от базы данных, к которым у нас нет доступа, а также является неполным. Чтобы найти вашу проблему, мне пришлось взять ваш код и создать с его помощью небольшую исполняемую программу, mcve (пожалуйста, прочтите ссылка на сайт):

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, чтобы отвечать на ваши вопросы.

Кроме того, это подробное окно должно быть не JFrame, а скорее JDialog.

person Hovercraft Full Of Eels    schedule 10.04.2016
comment
Большой. Работал. Спасибо - person Sebastian Zeki; 10.04.2016
comment
@SebastianZeki: пожалуйста. Пожалуйста, ознакомьтесь с дополнением к моему ответу. - person Hovercraft Full Of Eels; 10.04.2016
comment
Ой. Извиняюсь. Я буду MCVE больше в следующий раз. Тем не менее, большое спасибо за ваши усилия. - person Sebastian Zeki; 10.04.2016