JTable row auswählen mit Enter auswählen und fenster schliessen?

tomtutor0815

Grünschnabel
Hi,

innerhalb eines JFrame wird ein zweites JFrame erzeugt, in dem daten aus deiner DB(oracle)
angezeigt werden- mittels JTable. Die ergebnissmenge ist sagen wir 10 rows. Das wird korrekt in einer JTable angezeigt. Nun möchte ich mit den cursor tasten auf eine row positionieren und mit <ENTER> auswählen. daraufhin soll das JFrame mit dem JTable geschlossen werden und die ausgewählte zeile an das haupt-Fenster (JFrame) übergeben werden. Ebenso soll eine zeile mit einem Doppelclick ausgewählt werden können, und das JTable geschlossen werden.

soweit so gut.
Das einzige was ich nicht hin bekomme ist, den doppelclick bzw. die Entertaste abzufragen.
Ich hab eine KeyListner und MouseListner der Jtable zugewiesen. Aber wie frage ich ab,
was passiert ist?

public void getTableItem(String[][] daten, String [] columnNames){
JFrame jFrame = new JFrame();
// JTable table = new JTable(daten, columnNames );
JTable table = new JTable(new xTableModel(daten, columnNames));
final TableKeyEventHandler tableKeyEventHandler = new TableKeyEventHandler();
final TableMouseEventHandler tableMouseEventHandler = new TableMouseEventHandler();

table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.addKeyListener(tableKeyEventHandler);
table.addMouseListener(tableMouseEventHandler);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

ListSelectionModel rowSM = table.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener() {

public void valueChanged(ListSelectionEvent e) {

ListSelectionModel lsm = (ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()) {
System.out.println("No rows are selected.");
} else {
int selectedRow = lsm.getMinSelectionIndex();

hier müsste man abfragen ob <entertaste> oder doppelclick
passiert ist. wie geht das? wie muss der listner dazu aussehen



tableKeyEventHandler.keyPressed(?)

System.out.println("Row " + selectedRow
+ " is now selected.");
}
}
});


jFrame.getContentPane().add( new JScrollPane(table) );
// jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
jFrame.pack();
jFrame.setVisible( true );
}

vielen dank für eure hilfe.
 
du solltest den KeyListener so implementieren (also den KeyCode abfragen):

Java:
public class blabla implements KeyListener{
	...
	public void keyPressed(KeyEvent arg0) {
		if(arg0.getKeyCode() == 10){
			...
		}
	}

	public void keyReleased(KeyEvent arg0) {
		
	}

	public void keyTyped(KeyEvent arg0) {
		
	}
	...
}

KeyCode 10 ist <ENTER> - Alle anderen KeyCodes werden dann ignoriert. Ich hoffe den Rest kannste dir selber erarbeiten ;) Bin noch zu müde zum denken ... xD

Und mal ein Tipp. Wenn du mal einen Tastencode suchst, gib ihn einfach per
Java:
	public void keyPressed(KeyEvent arg0) {
		System.out.println(arg0.getKeyCode());
	}
aus

Greeze Chimaira
 
Zuletzt bearbeitet:
Moin!
Man kann sich die lästige Sucherei nach dem numerischen Wert des KeyCode auch ganz einfach sparen, in dem man den KeyCode des Events einfach mit den vorgefertigten Konstanten vergleicht: (gibts für jede Taste und kann man leicht in der API nachschauen)
Code:
public void keyPressed(KeyEvent evt){
           if(evt.getKeyCode() == KeyEvent.VK_ENTER){
           ...
           }


}
*grüssle*
MeinerEiner
 
vielen dank für die antworten.

den keylistner (und einen mouslistner) hab ich in dieser form bereits implementiert.
mein problem (vielleicht hab ichs nicht beschrieben) liegt darin:

der jtable - viewer (die methode getTableItem) die ich gepostet habe, liegt in einer klasse A
der listner liegt in einer anderen klasse, sagen wir B

wie komme ich nun in der klasse A an die information die in B ermittelt wurde?
ich glaube ich stehe voll auf der leitung...?

also nochmal technisch:
-----------------------------------------------------------------------
klasse A
...
TabKeyEvent tabKeyEvent = new TabKeyEvent();
table.addKeyListener(tabKeyEvent);

wie komme ich hier an das event



...
--------------------------------------------------------------------------------------
klasse B
public class TabKeyEvent implements KeyListener {

public TabKeyEvent() {
// TODO Auto-generated constructor stub
}

public void keyPressed(KeyEvent e) {

}

vielen dank nochmals.
 
Moin!
Halte dich doch bitte an die Netiquette bezüglich Klein- und Großschreibung!
Du solltest dich auch mal ein bisschen mehr in Java einlesen. Wie man Daten von einem Objekt an ein anderes übergibt sind Grundlagen!

Generell: Es gibt viele Möglichkeiten zur Lösung dieses "Problems". Eine wäre (wenn wir mal bei deinem Beispiel bleiben), eine Referenz von Klasse A per Konstruktor an Klasse B zu übergeben. Sobald das Event eintrifft, kannst du dann eine Methode von A (die es dann noch zu implementieren gilt) von B mit diesem Event als Argument aufrufen.

*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Hi hier mal ein Beispiel das nach deinem Prinzip funktionieren sollte.

TableSample.java
Code:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class TableSample extends JFrame implements KeyListener, MouseListener{

    private JFrameSample sample;
    private JTable table;
    
    public TableSample(JFrameSample sample) {
        this.setLayout(new GridLayout(1,0));
        this.sample = sample;
        String[] columnNames = {"1",
                "2",
                "3",
        "4"};

        Object[][] data = {
                {"A", "B", "C", new Integer(1)},
                {"D", "E", "F", new Integer(2)},
                {"G", "H", "I", new Integer(3)},
                {"J", "K", "L", new Integer(4)},
                {"M", "N", "O", new Integer(50)}
        };

        table = new JTable(data, columnNames){

            @Override
            public boolean isCellEditable(int arg0, int arg1) {
                // TODO Auto-generated method stub
                return false;
            }
            
        };
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
        table.setColumnSelectionAllowed(true);
        table.getTableHeader().setReorderingAllowed(true);
        table.addKeyListener(this);
        table.addMouseListener(this);
        
        JScrollPane scrollPane = new JScrollPane(table);
        this.add(scrollPane);
        
        createAndShowGUI();

    }


    private void createAndShowGUI() {

        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        this.pack();
        this.setVisible(true);
    }

    @Override
    public void keyPressed(KeyEvent ev) {
        // TODO Auto-generated method stub
        if (ev.getKeyCode() == KeyEvent.VK_ENTER){
            String text = (String) table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
            sample.doSomething(text);
            this.dispose();
        }
    }

    
    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void mouseClicked(MouseEvent ev) {
        // TODO Auto-generated method stub
        
        if (ev.getClickCount() == 2){
            String text = (String) table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
            sample.doSomething(text);
            this.dispose();
        }
    }


    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub
        
    }
}
JFrameSample.java
Code:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class JFrameSample implements ActionListener{
    
    JLabel lb_test;
    
    private void createAndShowGUI() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        
        lb_test = new JLabel("");
        JButton bt_Action = new JButton("Action");
        bt_Action.addActionListener(this);
        
        frame.add(lb_test, BorderLayout.CENTER);
        frame.add(bt_Action, BorderLayout.SOUTH);
        
        frame.setSize(100, 100);
        frame.setVisible(true);
    }

    public JFrameSample(){
        createAndShowGUI();
    }
    
    public static void main(String[] args) {

        new JFrameSample();
    }

    public void doSomething(String text){
        this.lb_test.setText(text);
    }
    
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        new TableSample(this);
    }
}
Dies zeigt nur 1 Möglichkeit.
 
@Ryu20

public void keyPressed(KeyEvent ev) {
// TODO Auto-generated method stub
if (ev.getKeyCode() == KeyEvent.VK_ENTER){
String text = (String) table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
sample.doSomething(text);
this.dispose();
}
}

Das war der entscheidende Hinweis.
Vielen Dank.
 
Zurück