Avatar billede luctatic Nybegynder
22. august 2005 - 22:58 Der er 6 kommentarer og
1 løsning

knap er ligeglad med disable

Jeg har nu prøvet at hjælpe en ven med et problem i en javaapplet han har, og vi har nu begget stirret os blinde i et par timer over noget der sikkert er et miniproblem.

Forestil jer en javaapplet hvor der er nogle knapper - disse knapper skal ændre farve når man trykker på den, men de skal kun skifte en eneste gang. Når man trykker på dem første gang sættes de til at være disablede.

Problemet er her, at selvom de er disablede (kan ses når vi prøver at skrive knappen ud) så skifter de stadig farve og kan stadig blive trykket på. Er der nogen der har en god forklaring til hvorfor i alverden det kan lade sig gøre? Kode eksempel følger hvor, hvis man laver en form med sådan en ToeButton på og clicker på den, så skifter den hele tiden farve mellem sort og blå selvom den burde være disabled:

public class ToeButton    extends JButton
{
  int state = BLANK;
  public int buttonNr;
       
  public ToeButton(int x)
  {
    addMouseListener(new ML());
    setBackground(Color.cyan);
    buttonNr = x; 
  }


  class ML extends MouseAdapter
  {
    public void mouseClicked (MouseEvent e)
    {
        JButton tester =(JButton) e.getSource();
    Object[] mla = tester.getMouseListeners();
    for(int i=0;i<mla.length;i++)
    {
      System.out.println(i+": "+mla[i]);
    }

    System.out.println();
    tester.setEnabled(false);
               
    if(tester.getBackground() == Color.BLACK)
      {tester.setBackground(Color.blue);}
    else
      tester.setBackground(Color.BLACK);
    }
  }
}
Avatar billede luctatic Nybegynder
22. august 2005 - 23:18 #1
Lavede lige et eksempel der er lige til at kopiere ind og afvikle selv så man kan se hvad jeg mener - samtidigt er det så også lidt mere læseligt end her på eksperten:

http://phpfi.com/75253
Avatar billede snoop_one Nybegynder
23. august 2005 - 04:48 #2
Det er fordi du benytter dig af en masse ting som så bliver rodet sammen.
Dit program opføre sig faktisk rigtigt nok :) Men du skal bare adde en actionListener istedet for mouseListeneren - så burde det virke som du gerne vil have det.

Dvs. class ML implements ActionListener -> du skal erstatte din mouseClicked methode med en actionPerformed metode.
Avatar billede luctatic Nybegynder
23. august 2005 - 08:15 #3
Yep - det virker med actionPerformed(ActionEvent e) istedet for mouseClicked(MouseEvent m). Nu vil jeg bare vil hvorfor i himlens navn det ikke virker med en MouseAdapter. Er en MouseAdapter ligeglad med om det den lytter på er disabled eller ej?
Avatar billede luctatic Nybegynder
23. august 2005 - 12:18 #4
Du skal også lige huske at smide et svar :D
Avatar billede snoop_one Nybegynder
23. august 2005 - 13:52 #5
Nemlig.
Så du kunne simulere det samme i din mouse listener ved at indsætte understående linie:

mouseClicked(MouseEvent e) {
    JButton tester = (JButton) e.getSource();
    if (tester.isEnabled()) {
      ....
    }
}

Men så kan du selv afgøre hvilken kode der er pænest ;0)
Avatar billede luctatic Nybegynder
23. august 2005 - 14:17 #6
Jeg fatter stadig ikke hvorfor mouseadapter'en ikke kigger på om knappen er enabled eller ej - men sådan er der jo nok så mange ting.
Avatar billede mikkelbm Nybegynder
23. august 2005 - 21:40 #7
En MouseAdapters opgave er at lytte på om der bliver trykket på en komponent eller ej - uanset om den er enabled eller disabled.

Du kan jo også trykke på en knap med space, så der vil din mouselistener jo også være ubrugelig - derfor fyrer den en actionPerformed, når man trykker på den.
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