Avatar billede tendal Nybegynder
30. november 2004 - 20:21 Der er 6 kommentarer og
1 løsning

problem med JPopupMenu

Hej
Jeg sidder og er ved at lave en JPopupMenu som skal fremkomme hvis man trykker inden for et bestemt område - dette er implementeret på følgende måde
public void mouseClicked (MouseEvent event)
    {
        Point p = event.getPoint();
        double x = p.getX();
        double y = p.getY();
        int v = (int) (x+100);
        int z = (int) (y+50);
        System.out.println(p);
        System.out.println(v + " " + z);
        if(currentPic == 1 && x<660 && x>450 && y>150 && y<360)
        {
            popUp.setLocation(v,z);
            popUp.setVisible(true);
        }...
Problemet er imidlertid at der ikke sker noget når man køre musen hen over denne - ingen af de 2 menupunkter jeg har puttet i den markeres. Hvorfor?
Derefter skal jeg naturligvis ha lavet en Listener på denne menu - men jeg kan ikke bruge den samme da der skal ske forskellige ting afhængig af hvor menuen kaldes frem. Hvordan kan jeg gøre dette smartest. Er det nemmere at lave flere popups eller kan det lade sig gøre med den samme?
Avatar billede _carsten Nybegynder
30. november 2004 - 20:39 #1
Nu kan vi jo ikke se hvordan du laver den popup, men det lyder som om den
ikke har focus.

Prøv at erstatte:
            popUp.setLocation(v,z);
            popUp.setVisible(true);

Med:
            popUp.show(this, v,z);

Hvis din mouseListener er implementeret i "this" class.
Tvivler egentlig på det løser noget, men ...........
Tror mere på fejlen ligger et andet sted.
Avatar billede tendal Nybegynder
30. november 2004 - 22:56 #2
Da det ikke er en alm PopupMenu men en JPopupMenu kan jeg ikke bruge metoden show, men det problem jeg har lige nu er sådan set bare det med at menupunkterne ikke blive "hifhlighted" når musen køres over - det andet med Listeneren har jeg selv løst - måske ikke så pænt med det virker. Men jeg vil stadig gerne vide hvordan jeg får menupunkterne til at blive highlighted
Avatar billede _carsten Nybegynder
01. december 2004 - 10:25 #3
Du kan da sagtens bruge show() på en JPopupMenu - ingen problemer i det !!

Men som jeg skrev tidligere, ligger problemet et andet sted, du fjerner focus
fra din JPopupMenu en brøkdel af et sekund efter den vises !

Altså vis popup, men fjern ikke focus fra den, hvilket du gør pt.

Skal vi hjælpe, skal vi se mere kode.
Avatar billede tendal Nybegynder
03. december 2004 - 08:29 #4
Hvor i koden ændres fokus et brøkdel af et sekund efter den vises? Jeg ved ikke lige hvor meget kode der er at vise - det er vel her der sker noget med popup menuen???
Avatar billede _carsten Nybegynder
04. december 2004 - 10:08 #5
Ja - en JPopupMenu skal kende sin parent/forælder ellers beholder parent focus.
Prøv at trykke på knappen "Vis popup med setVisible()" menuerne markeres ikke når du kører musen henover, tryk derefter på knappen "Vis popup med show()", nu kender popup'en sin parent og knap 1 vil nu også virke.

Du kan også få knappen "Vis popup med setVisible()" til at virke med det samme, ved at fortælle popup'en hvem der er dens parent, kig på min metode vispop() og fjern udkommenteringen af linien popup.setInvoker(this); så vil knappen "Vis popup med setVisible()" virke med det samme.

Test klasse:



public class PopupTest extends javax.swing.JFrame {
   
    public PopupTest() {
        initComponents();
        setSize(400,400);
    }
   
    private void initComponents() {
        popup = new javax.swing.JPopupMenu();
        jMenu1 = new javax.swing.JMenu();
        jMenu2 = new javax.swing.JMenu();
        knap1 = new javax.swing.JButton();
        knap2 = new javax.swing.JButton();

        jMenu1.setText("Dette er menu 1");
        popup.add(jMenu1);

        jMenu2.setText("Dette er menu 2");
        popup.add(jMenu2);

        getContentPane().setLayout(new java.awt.FlowLayout());

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        knap1.setText("Vis popup med setVisible()");
        knap1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                vispop(evt);
            }
        });

        getContentPane().add(knap1);

        knap2.setText("Vis popup med show()");
        knap2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                vispopup(evt);
            }
        });

        getContentPane().add(knap2);

        pack();
    }

    private void vispop(java.awt.event.ActionEvent evt) {
        popup.setLocation(150,250);
        //popup.setInvoker(this);
        popup.setVisible(true);
    }

    private void vispopup(java.awt.event.ActionEvent evt) {
        popup.show(this, 150, 250);
    }
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new PopupTest().setVisible(true);
            }
        });
    }

    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JButton knap1;
    private javax.swing.JButton knap2;
    private javax.swing.JPopupMenu popup;
}
Avatar billede _carsten Nybegynder
04. december 2004 - 10:11 #6
Sagt på en anden måde, du skal indskyde setInvoker(this); i den kode

            popUp.setLocation(v,z);
            popUp.setInvoker(this); // hvis "this" er parent/invoker
            popUp.setVisible(true);
Avatar billede tendal Nybegynder
05. december 2004 - 12:29 #7
Super fedt - tak for hjælpen. Altid rart når nogen kan berige ens viden om Java.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester