F
FreeCastle
Gast
Hi,
ich habe mir eine eigene Klasse erstellt, welche von JPanel erbt. Als Zusatz hat diese Klasse ein Attribut welches ein Image enthält, dass auf dem Panel gezeichnet wird. Das sieht dann vereinfacht so aus:
So weit so gut. Wie man sieht habe ich die paintComponent-Methode überschrieben, so dass das Image auch tatsächlich gezeichnet wird.
Jetzt wollte ich allerdings noch ein Popup-Menu hinzufügen, das aufgerufen wird sobald man einen Rechtsklick auf so ein Panel macht. Das sieht dann so aus:
Wie man sieht hat sich nicht viel verändert, ich füge halt das simple Popup-Menü zum Panel hinzu und erstelle dafür einen MouseListener. Das Problem ist jetzt aber, dass das Popup nicht wirklich erscheint wenn ich einen Rechtsklick mache. Das geht nur ganz langsam und "verkrüppelt". Das Problem liegt, so denke ich, daran dass ich eben ein eigenes Panel hab und die paintComponent-Methode überschrieben habe. Ich habe deshalb nämlich mal folgendes in der paintComponent-Methode ausprobiert:
So wird das Popup-Menü *immer* sichtbar, und wenn ich dann einen Rechtsklick auf das entsprechende Panel mache dann funktioniert es einwandfrei und flüssig. Nur stört jetzt eben die Tatsache, dass schon immer das PopupMenü sichtbar ist. Ich habs auch schon mit den beiden oben auskommentierten Ifs mal probiert, aber das hat auch nix gebracht. Wie kann ich also ein normales Popupmenü-Verhalten erreichen ? Wär super wenn mir da jemand helfen könnte...
ich habe mir eine eigene Klasse erstellt, welche von JPanel erbt. Als Zusatz hat diese Klasse ein Attribut welches ein Image enthält, dass auf dem Panel gezeichnet wird. Das sieht dann vereinfacht so aus:
Code:
public class ImagePanel extends JPanel {
private Image content;
private int width,height;
public ImagePanel(Image image, int w, int h) {
super();
content = image;
width = w;
height = h;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(content,0,0,width,height,null);
}
public Dimension getPreferredSize() {
return new Dimension(width,height);
}
}
So weit so gut. Wie man sieht habe ich die paintComponent-Methode überschrieben, so dass das Image auch tatsächlich gezeichnet wird.
Jetzt wollte ich allerdings noch ein Popup-Menu hinzufügen, das aufgerufen wird sobald man einen Rechtsklick auf so ein Panel macht. Das sieht dann so aus:
Code:
public class ImagePanel extends JPanel {
private Image content;
private int width,height;
private JPopupMenu popup;
private JMenuItem rotateItem,renameItem;
public ImagePanel(Image image, int w, int h) {
super();
content = image;
width = w;
height = h;
popup = new JPopupMenu();
rotateItem = new JMenuItem("Rotate...");
renameItem = new JMenuItem("Rename...");
popup.add(rotateItem);
popup.add(renameItem);
this.add(popup);
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent me) {
if ( me.isPopupTrigger() ) {
popup.show(me.getComponent(),me.getX(),me.getY());
}
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(content,0,0,width,height,null);
}
public Dimension getPreferredSize() {
return new Dimension(width,height);
}
}
Wie man sieht hat sich nicht viel verändert, ich füge halt das simple Popup-Menü zum Panel hinzu und erstelle dafür einen MouseListener. Das Problem ist jetzt aber, dass das Popup nicht wirklich erscheint wenn ich einen Rechtsklick mache. Das geht nur ganz langsam und "verkrüppelt". Das Problem liegt, so denke ich, daran dass ich eben ein eigenes Panel hab und die paintComponent-Methode überschrieben habe. Ich habe deshalb nämlich mal folgendes in der paintComponent-Methode ausprobiert:
Code:
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(content,0,0,width,height,null);
//if (popup.isVisible())
//if (popup.isShowing())
popup.paintComponents(g);
}
So wird das Popup-Menü *immer* sichtbar, und wenn ich dann einen Rechtsklick auf das entsprechende Panel mache dann funktioniert es einwandfrei und flüssig. Nur stört jetzt eben die Tatsache, dass schon immer das PopupMenü sichtbar ist. Ich habs auch schon mit den beiden oben auskommentierten Ifs mal probiert, aber das hat auch nix gebracht. Wie kann ich also ein normales Popupmenü-Verhalten erreichen ? Wär super wenn mir da jemand helfen könnte...