2016-04-10 22 views
1

Ich habe überall gesucht, aber kann nicht scheinen, dies herauszufinden. Ich möchte nur den Wert einer Zelle aus meiner JTable herausziehen, wenn ein Benutzer darauf klickt.Holen Wert von einer Zelle in JTable

Aber im Moment bekomme ich -1, also nehme ich an, Doppelklick führt dazu, dass keine Zeile erkannt wird. Hier ist der Code:

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); 
       } 
      } 
     }); 

Antwort

1

Ihr Hauptproblem ist hier:

tablePatientDt.setEnabled(false); 

Da die Tabelle nicht aktiviert ist, kann keine Zelle oder Zeile immer ausgewählt werden, und so die ausgewählte Zeile wird immer - 1. Lösung: Entferne diese Linie. Stattdessen, wenn Sie nicht wollen, eine Zelle mit Doppelklick bearbeitet werden, überschreiben die JTable oder sein Modell und überschreiben die isCellEditable Methode:

zB

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

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

Weitere Themen: fügen Sie nicht die JTabelle zu mehr als einer Komponente wie Sie tun. Dies bedeutet ein großes Risiko für Probleme, da Swing-Komponenten jeweils nur einer Komponente hinzugefügt werden können.

Eine Seite Empfehlung: in Ihrer Zukunft Fragen nur kleine kompilierbare und ausführbare Programme. Ihr oben angegebener Code kann nicht ausgeführt werden, da Datenbankabhängigkeiten vorliegen, auf die wir keinen Zugriff haben und die außerdem unvollständig sind. Um Ihr Problem zu finden, musste ich den Code nehmen und ein kleines runnable Programm mit ihm zu schaffen, einen mcve (lesen Sie bitte auf dem 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); 
    } 
} 

Aber eigentlich sollten diese Bemühungen Sie gehören nicht ich, da wir Sind alle Freiwillige, und Sie sind derjenige, der um Hilfe bei der Lösung eines Problems bittet. Daher bitten wir Sie in Zukunft, Ihre eigenen mcve zu Ihren Fragen zu erstellen.

Auch dieses Detailfenster sollte kein JFrame, sondern ein JDialog sein.

+0

Großartig. Hat funktioniert. Danke –

+0

@SebastianZeki: Gern geschehen. Bitte lesen Sie den Anhang zu meiner Antwort. –

+0

Oh. Es tut uns leid. Ich werde das nächste Mal mehr MCVE. Vielen Dank für Ihre Bemühungen. –