JTable, Popup Fester per Rechtsklick auf Zelle

Terry123

Mitglied
Hallo,
die Überschrift sagt eigentlich schon alles 🙂

Ich hab eine Tabelle und möchte gerne, dass bei Rechtsklick auf eine beliebige Zelle in einer bestimmten Reihe ein kleines Popup-Fenster erscheint. In diesem Fenster will ich dann eine Auswahl an Strings stehen haben, die ich dann per Knopfdruck in die Zelle schreiben kann. Der Inhalt des Popup-Fensters soll je nach Zelle unterschiedlich sein.

Leider sind meine Swing-Kenntnisse etwas begrenzt. Wie muss ich an die Sache rangehen?

Danke euch!
 
ja, das geht. aber das hilft mir nicht weiter. ich brauch eine Auswahl an Strings, die ich dann per Checkbox auswählen will und dann in die Zelle (TextArea) schreiben will.
 
Man kann einen MouseListener an der JTable registieren.
Bei Rechtsklick kann mit den Methoden columnAtPoint(Point p) und rowAtPoint(Point p) ermitteln über welcher Zelle der Rechtsklick gemacht wurde und ein entsprechendes JPopupMenu anzeigen lassen.
 
Vielen Dank! Deine Tipps sind echt hilfreich.

Jetzt hab ich aber ein neues Problem 🙂

Wie bekomm ich einen Rechtklick bei nem MouseListener hin? Hab im Internet leider nicht viel dazu gefunden.

Danke!
 
Soweit ich mich erinnere kannst du das MouseEvent fragen, welcher Button geklickt wurde via getButton(). Button3 entspricht der rechten Maustaste mein ich.
 
Zuletzt bearbeitet:
ok, danke dir.

Da wäre noch was 🙂
Ich hab jetzt das Menu erstellt aber es wird nicht angezeigt. Ich hab nun gesehen dass es Befehle gibt wie "setVisible" und "show".
Ausserdem hab ich folgende Befehle gefunden, und weiss nun nicht wie man richtig vorgeht.

firePopupMenuCanceled()
firePopupMenuWillBecomeInvisible()
firePopupMenuWillBecomeVisible()

Bin etwas verwirrt. Was genau macht man denn mit den fire-Befehlen? Wozu gibt es die?
JPopupMenu (Java 2 Platform SE v1.4.2)
Ich kann mit den Beschreibungen "Notifies PopupMenuListeners that this popup menu..." nicht viel anfangen. ;(

Danke nochmals für eure Hilfe!
 
Zuletzt bearbeitet:
Diese Methoden sind für Dein Vorhaben irrelevant.
Hier mal ein kurzes Tutorial.Bringing Up a Popup Menu
Zum Anzeigen des Popups wird hier die Methode show(Component, int, int) verwendet, wobei in Deinem Fall die Komponente Deine JTable und x und y die Koordinaten des MouseEvents sind.
 
Ah, "show" ist also der Befehl den ich brauche. Danke.

Jetzt ist mir leider unklar was ich bei

show(Component invoker, int x, int y)

als "Component invoker" eingebe.
Muss da der Table stehen, oder die Zelle? Ist x und y die Position in Pixel innerhalb der Komponente?
Entschuldigt meine Unwissenheit ;(
 
Steht ja eigentlich schon in der Antwort und dem Link, den Michael dir zur Verfügung gestellt hat.

Display the popup menu at the specified x,y position (specified in that order by the integer arguments) in the coordinate system of the specified component.


Sprich, du übergibst die X und Y Koordinaten ausgehend von der übergebenden Komponente, auf der das PopUpMenü dargestellt werden soll. Wenn ich mich nicht ganz irre, kannst du dort aber auch die Tabellenzelle, anstelle der Table selbst als Ausgangskomponente übergeben, sofern du das PopUp dort platzieren möchtest. Das vereinfacht natürlich die Positionsbestimmung. Und ja, die Angabe ist in Pixel ausgehend von Nordwest der jeweiligen Komponente.
 
Zuletzt bearbeitet:
Jetzt ist mir leider unklar was ich bei
show(Component invoker, int x, int y)
als "Component invoker" eingebe.
siehe meinen letzten Post
wobei in Deinem Fall die Komponente Deine JTable und x und y die Koordinaten des MouseEvents sind.
Muss da der Table stehen, oder die Zelle?
Eine Tabellenzelle ist keine Komponente, sie ist nur ein Bild, das von der JTable gemalt wird.
Entschuldigt meine Unwissenheit ;(
Unwissenheit ist nicht zu entschuldigen. Die kann man durch Fragen aber auch durch Lesen bekämpfen ;-)
 
funktioniert. danke 🙂

bin aber schon wieder auf was gestossen was ich nicht ganz verstehe ;(

Es gibt ja diese 3 Möglichkeiten um ein PopupMenu zu füllen:

JMenuItem add(Action a)
Appends a new menu item to the end of the menu which dispatches the specified Action object.

JMenuItem add(JMenuItem menuItem)
Appends the specified menu item to the end of this menu.

JMenuItem add(String s)
Creates a new menu item with the specified text and appends it to the end of this menu.

Ich möchte im Prinzip auf alle MenuItems den gleichen Befehl legen, und zwar den String des MenuItems nehmen und in die Zelle schreiben. Bisher hab ich die MenuItems mit der 3. Variante dem PopupMenu hinzugefügt, weiss nun aber nicht wie ich einen Befehl auf die MenuItems bekomme. Muss ich eventuell Variante 1 oder 2 nehmen?
 
Eine Tabellenzelle ist keine Komponente, sie ist nur ein Bild, das von der JTable gemalt wird.


Ja, dass stimmt natürlich, hab da was durcheinander geworfen. Worauf ich hinaus wollte ist, dass man die Tabelle nach der Größe und Position der gezeichneten Tabellenzelle befragen kann via:

Java:
table.getCellRect(int row, int column, boolean includeSpacing)

Anhand diesen Rechtecks kann man dann gut die Position auf der Tabelle ausrechnen. Das ist zum Beispiel praktisch, wenn man das PopUpMenü an einer bestimmten Stelle platzieren möchte, wie beispielsweise direkt neben der Tabellenzelle. Row und Column der Tabelle können einfach über die Koordinaten des Mouseevents via:

Java:
table.rowAtPoint( Point )
table.columnAtPoint(Point)

erfragt werden.
 
funktioniert. danke 🙂

bin aber schon wieder auf was gestossen was ich nicht ganz verstehe ;(

Es gibt ja diese 3 Möglichkeiten um ein PopupMenu zu füllen:

JMenuItem add(Action a)
Appends a new menu item to the end of the menu which dispatches the specified Action object.

JMenuItem add(JMenuItem menuItem)
Appends the specified menu item to the end of this menu.

JMenuItem add(String s)
Creates a new menu item with the specified text and appends it to the end of this menu.

Ich möchte im Prinzip auf alle MenuItems den gleichen Befehl legen, und zwar den String des MenuItems nehmen und in die Zelle schreiben. Bisher hab ich die MenuItems mit der 3. Variante dem PopupMenu hinzugefügt, weiss nun aber nicht wie ich einen Befehl auf die MenuItems bekomme. Muss ich eventuell Variante 1 oder 2 nehmen?

ActionListener!
 
Mein Probem ist, dass ich nicht weiss an was ich den Actionlistener hinhängen soll. ;(

Ich hab bisher einfach mit popupmenu.add("String") MenuItems hinzugefügt. Aber die haben doch keinen Namen den ich verwenden kann.

EDIT:
Mir fällt grad auf, ich könnte doch folgendes machen, oder?

JMenuItem mi = popupmenu.add("String");

nochmal EDIT:
Oder geht auch das hier?

popupmenu.add("String").addActionListener(new ActionListener() {
 
Zuletzt bearbeitet:
Ja, so geht da auch, du solltest aber nicht den ActionListener immer mit new erstellen, sondern immer den selben nehmen.
 
Weil du so einen neuen amchst, du aber immer den gleichen nutzen möchtest?

Kennst du dich eig. mit den Grundlagen aus ? 😵
 
Code:
ActionListener myListener = new ActionListener() {
  .....
};

popupmenu.add("String").addActionListener(myListener);
....
popupmenu.add("otherString").addActionListener(myListener);
 

Neue Themen


Zurück
Oben