JTable mit JPopupMenu
wie kann ich verhindern, dass das auslösen und zeigen JPopupMenu
nur, wenn Mouse Cursor
über ausgewählte JTable'Row
meine Frage: wenn gibt es einen anderen Weg als getBounds
von der ausgewählten Zeile und bestimmen/Vergleiche, die mit Mouse
position...
meine einfache sscce gezeigt, un-wollte gegenüber status, eine beliebige Zeile ausgewählt werden konnte und JPopupMenu
ausgelöst wird, wird von der ganzen JTable
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableCheckBox extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
public TableCheckBox() {
Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
Object[][] data = {
{"Buy", "IBM", new Integer(1000), new Double(80.50), false},
{"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true},
{"Sell", "Apple", new Integer(3000), new Double(7.35), true},
{"Buy", "Nortel", new Integer(4000), new Double(20.00), false}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
createPopupMenu();
}
private void createPopupMenu() {
JPopupMenu popup = new JPopupMenu();
JMenuItem myMenuItem1 = new JMenuItem("cccccccccccccccccccccc");
JMenuItem myMenuItem2 = new JMenuItem("bbbbbbbbbbbbbbbbbbbbbb");
popup.add(myMenuItem1);
popup.add(myMenuItem2);
MouseListener popupListener = new PopupListener(popup);
table.addMouseListener(popupListener);
}
private class PopupListener extends MouseAdapter {
private JPopupMenu popup;
PopupListener(JPopupMenu popupMenu) {
popup = popupMenu;
}
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
if (table.getSelectedRow() != -1) {
maybeShowPopup(e);
}
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableCheckBox frame = new TableCheckBox();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
});
}
}
Schön SSCCE durch die Art und Weise.
tun. nicht. Unterklasse. die. anzeigen . für. Modell. Gründen.
Die Lösung funktionierte für mich am besten (auch von kleopatra) ist nicht verlinkt hier noch: stackoverflow.com/a/17316876/411282
tun. nicht. Unterklasse. die. anzeigen . für. Modell. Gründen.
Die Lösung funktionierte für mich am besten (auch von kleopatra) ist nicht verlinkt hier noch: stackoverflow.com/a/17316876/411282
InformationsquelleAutor mKorbel | 2011-09-14
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine interessante Frage, denn es unterstreicht die fehlende api auf JComponent 🙂
Wie wir alle wissen, ist der empfohlene Weg, sich zu registrieren popupMenus ist die Verwendung der componentPopupMenu Eigenschaft. Verwandte api ist
was fehlt (und tatsächlich benötigt werden für diese Forderung) ist
dieser Mangel ist umso ärgerlicher, als die getPopupLocation aufgerufen wird (durch AWTEventHelper tief in die LAF) nach getComponentPopup(). Es gibt also keinen Spielraum für einen hack wie die Speicherung der letzten Maus-Ereignis, das ausgelöst haben könnte, das popup und dann entscheiden, welche/wenn return popup. Und die Rückgabe von null für den Standort wird nur das Ergebnis zeigen, es an der Position der Maus
Nur die (schmutzige) hack (um meine äußerste Zurückhaltung, um meine Hände schmutzig mit einem MouseListener 😉 ist das überschreiben getComponentPopup und entscheiden, ob oder nicht zurückgeben, basierend auf der aktuellen Maus-position
der Nebeneffekt ist, dass popup-zeigt, ist nicht ausgelöst durch die Tastatur, solange sich die Maus irgendwo über dem Tisch, die vielleicht oder auch nicht ein problem sein.
Möglicherweise gibt es eine zusätzliche problem, ich denke, aufgrund der Verwendung eines
JScrollPane
Einbettung derJTable
. In der Vergangenheit, ich erinnere mich an Probleme mit Ereignisse, die nicht auftreten, auf dieJTable
beim Klick außerhalb einer Reihe (aber inside dieJScrollPane
im leeren Raum): ich hatte zu hören, für die Ereignisse auf derJScrollPane
selbst (oder dieJViewport
erinnere mich nicht genau). Also vielleicht @mKorbel, Sie haben auch zu berücksichtigen, dass (sollte das passieren, wenn dieJScrollPane
höher ist als derJTable
).keine Ahnung, wie möglich zu verbrauchen Ereignisse von der Maus zum JViewPort, können Sie uns ein Beispiel über consiming Mausevents ab/bis JViewPort, denn ich halte das für völlig taub JComponent 🙂
hmm ... verstehe nicht ganz, welches problem du meinst: Sie können die Logik der wenn-zeigen-was, wie gebraucht. Heute, alle Tabellen, die so konfiguriert sind, passen die viewport-Höhe sowieso (SwingX standardmäßig tut-und niemand beschwerte sich - das ist eine ziemlich Bemerkenswerte Tatsache in sich, denn die meisten sind geboren-beschweren-Typ 🙂
können Sie eine minimale Anzahl von sichtbaren Zeilen für
JTable
so, dass Sie genau das layout, das Sie wollen für Ihr Formular. Manchmal wird jedoch der eigentliche Tabelleninhalt kleiner ist als dieses minimum, dann wird eine leere Fläche erscheint unterhalb der Tabelle, innerhalb derJScrollPane
Grenzen; dieser leere Raum gehört nicht zu derJTable
aber Sie benötigen ihn eventuell zur popup-Anzeige (zB ein popup mit "Neue Zeile..."). Beachten Sie, dass ich erwähnt habe, ich konnte mich nicht erinnern, ob dieMouselistener
Hinzugefügt werden musstenJScrollPane
oderJViewport
, aber ich musste hinzufügen, dass es irgendwo auf, in Ergänzung zu denJTable
selbst.InformationsquelleAutor kleopatra
Sind Sie auf der Suche nach so etwas wie dieses vielleicht?
Zeigen popup über markierte Zeile(N) nur
Oder das Gegenteil, um zu verhindern, dass popup-von der Anzeige über die ausgewählten Zeilen nur:
+1 - wenn haben Sie ersetzt, dass die Schleifen und die manuelle überprüfung durch isRowSelected(Reihe) 🙂
sorry an alle. Ich war völlig falsch. Es scheint, dass das, was ich tun will, ist nicht möglich. Aber @kleopatra, würde ich gerne wissen: gibt es irgendeinen guten Grund für die Tatsache, dass cell-Renderer kann nicht mit Maus-event?
Sie sind nicht Teil der container-Hierarchie
und hier kommt mein vote 🙂
InformationsquelleAutor Hovercraft Full Of Eels