Avatar billede birkis Nybegynder
18. april 2002 - 22:49 Der er 22 kommentarer og
2 løsninger

Hjælp til lukning af JFrame

Jeg ønsker at man kan trykke ESC for at lukke ( dispose() ) JFrame'n.  Hvordan gør man det?


Koden:

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.*;

public class Test extends JFrame {
    private JPanel mainJPanel = new JPanel();
    private JPanel bottomJPanel = new JPanel();
    private JPanel leftJPanel = new JPanel();
    private JPanel centerJPanel = new JPanel();
   
    private JLabel navnJLabel = new JLabel("Navn:");
    private JTextField navnJTextField = new JTextField();
   
    private JButton okJButton = new JButton("OK");
    private JButton lukJButton = new JButton("Luk");
   
    public Test() {
        super("Test");
       
        // initialisering
       
        // listener's
       
        okJButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //ikke vigtigt
            }
        });
       
        lukJButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
       
        // layout
       
        final int X = 5; // eXtra luft mellem komponenterne
       
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
       
        mainJPanel.setBorder(new EmptyBorder(X, X, X, X));
        mainJPanel.setLayout(new BorderLayout(X, X));
        getContentPane().add(mainJPanel, BorderLayout.NORTH);
       
        bottomJPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, X, X));
        getContentPane().add(bottomJPanel, BorderLayout.SOUTH);
       
        leftJPanel.setLayout(new GridLayout(0, 1, X, X));
        mainJPanel.add(leftJPanel, java.awt.BorderLayout.WEST);
       
        centerJPanel.setLayout(new GridLayout(0, 1, X, X));
        mainJPanel.add(centerJPanel, java.awt.BorderLayout.CENTER);
       
        leftJPanel.add(navnJLabel);
        centerJPanel.add(navnJTextField);
       
        bottomJPanel.add(okJButton);
        bottomJPanel.add(lukJButton);

        setLocation(100,100);
        setSize(150,100);
        setVisible(true);
    }
    public static void main(String[] args) {
        new Test();
    }
}
Avatar billede datamaker Nybegynder
18. april 2002 - 23:25 #1
Du kan bruge en KeyListener, og checke om det er esc som bliver trykket.
Avatar billede codemon Nybegynder
18. april 2002 - 23:31 #2
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.*;

public class Test extends JFrame {
    private JPanel mainJPanel = new JPanel();
    private JPanel bottomJPanel = new JPanel();
    private JPanel leftJPanel = new JPanel();
    private JPanel centerJPanel = new JPanel();
   
    private JLabel navnJLabel = new JLabel("Navn:");
    private JTextField navnJTextField = new JTextField();
   
       
   
    private JButton okJButton = new JButton("OK");
    private JButton lukJButton = new JButton("Luk");
   
    public Test() {
        super("Test");
       
        // initialisering
       
        // listener's
       
        okJButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //ikke vigtigt
            }
        });
       
        lukJButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
       
        // layout
       
        final int X = 5; // eXtra luft mellem komponenterne
       
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
       
        mainJPanel.setBorder(new EmptyBorder(X, X, X, X));
        mainJPanel.setLayout(new BorderLayout(X, X));
        getContentPane().add(mainJPanel, BorderLayout.NORTH);
       
        bottomJPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, X, X));
        getContentPane().add(bottomJPanel, BorderLayout.SOUTH);
       
        leftJPanel.setLayout(new GridLayout(0, 1, X, X));
        mainJPanel.add(leftJPanel, java.awt.BorderLayout.WEST);
       
        centerJPanel.setLayout(new GridLayout(0, 1, X, X));
        mainJPanel.add(centerJPanel, java.awt.BorderLayout.CENTER);
       
        leftJPanel.add(navnJLabel);
        centerJPanel.add(navnJTextField);
       
        bottomJPanel.add(okJButton);
        bottomJPanel.add(lukJButton);

        setLocation(100,100);
        setSize(150,100);
        setVisible(true);
       
        // keylistener
        navnJTextField.addKeyListener(new KeyAdapter(){
            public void keyTyped(KeyEvent e){
                System.out.println("typed: " + e.getKeyCode());
                System.out.println("typed char : " + e.getKeyChar());
                System.out.println(e.VK_ESCAPE);
                System.out.println(''==e.getKeyChar());

            }
        });// anonym klasse KeyAdapter
   
       
    }
    public static void main(String[] args) {
        new Test();
    }
}
Avatar billede codemon Nybegynder
18. april 2002 - 23:36 #3
escape karakteren blev en firkant, men hvis du kopierer det ind i dit program virker det.

udskift så S.O.P'erne med fx  System.exit(0);
Avatar billede datamaker Nybegynder
18. april 2002 - 23:39 #4
ja, og super.dispose().
Avatar billede birkis Nybegynder
18. april 2002 - 23:49 #5
Jeg er muligvis lidt langsom i dag, men jeg kan ikke få det til at køre...

codemon >>  "escape karakteren blev en firkant"
Det ble den også da jeg kopierte det ind i NetBeans...?

Jeg testet koden, og udskriften blev:
typed: 0
typed char :
27
true
"og en firkant som ikke lod sig kopiere"

jeg tænker også lidt på om ikke funktionen kun vil fungere når markøren står i navnJTextField??
Avatar billede codemon Nybegynder
18. april 2002 - 23:53 #6
Hvis den viser true når du trykker esc virker det jo netop, indsæt så fx if (''==e.getKeyChar())
  System.exit(0);

Og jo, KeyListeneren er kun add'ed til tekstfeltet, men du kan jo bare add'e den til selve framen med

this.addKeyListener( ...
Avatar billede codemon Nybegynder
18. april 2002 - 23:57 #7
Det er dog nok ikke helt den rigtige måde at gøre det på (mener firkanten)

brug istedet
if (e.getKeyChar()==e.VK_ESCAPE)
  System.exit(0);
Avatar billede codemon Nybegynder
19. april 2002 - 00:00 #8
Jeg tror forresten ikke det er nok at have den til framen, måske skal den være på netop den komponent der er aktiv når der trykkes ESC. Men så kan du add'e den til begge (alle) men så burde man nok skille det ud i en klasse (eller metode) for sig selv for ikke at have den samme kode stående flere steder.
Avatar billede birkis Nybegynder
19. april 2002 - 00:03 #9
DOH!!

Jeg opdaget at den "firkant som ikke lod sig kopiere", var markøren i NetBeans...  Pinligt - jeg tror jeg skal finde sengen nu...

Men jeg fik
if(''==e.getKeyChar())
  System.exit(0);
til at fungere, men ikke this.addKeyListener(...  Hvad gør jeg forkert?
Avatar billede codemon Nybegynder
19. april 2002 - 00:06 #10
Som jeg nævnte, det er ikke nok at have have en keylistener til framen, den skal også være på teksfeltet.

fx

navnJTextField.addKeyListener(new KeyAdapter(){
            public void keyTyped(KeyEvent e){
                System.out.println("typed: " + e.getKeyCode());
                System.out.println("typed char : " + e.getKeyChar());
                System.out.println(e.VK_ESCAPE);
                System.out.println(''==e.getKeyChar());

            }
        });// anonym klasse KeyAdapter

this.addKeyListener(new KeyAdapter(){
            public void keyTyped(KeyEvent e){
                System.out.println("typed: " + e.getKeyCode());
                System.out.println("typed char : " + e.getKeyChar());
                System.out.println(e.VK_ESCAPE);
                System.out.println(''==e.getKeyChar());

            }
        });// anonym klasse KeyAdapter

men - samme kode 2 gange -(

og skal codemon kode sine dyner fra indersiden af øjenlågende, og det kan ikke gå stærkt nok.
Avatar billede birkis Nybegynder
19. april 2002 - 00:08 #11
Ahh...  Du er for hurtig for mig, codemon...  :-)

"måske skal den være på netop den komponent der er aktiv når der trykkes ESC."
Tænker du da på panels, knapper, og det hele??
Avatar billede codemon Nybegynder
19. april 2002 - 00:08 #12
og lige en gang til, udskift
System.out.println(''==e.getKeyChar());
med
if(''==e.getKeyChar())
  System.exit(0);
Avatar billede codemon Nybegynder
19. april 2002 - 00:09 #13
NEJ for pokker, jeg sover allerede jeg mener
    if (e.getKeyChar()==e.VK_ESCAPE)
                    System.exit(0);
Avatar billede birkis Nybegynder
23. april 2002 - 13:26 #14
Er jeg så nødt til at have
if (e.getKeyChar()==e.VK_ESCAPE)
    System.exit(0);
på alle tekstfelt, knapper, panels og frame?

Lige nu, er det den eneste måde jeg får det til at fungere på...
Avatar billede datamaker Nybegynder
23. april 2002 - 17:09 #15
Du er nød til at komme dine tilmeldte keyListeners i forkøbet.


import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.*;

public class Test extends JFrame {
    private JPanel mainJPanel = new JPanel();
    private JPanel bottomJPanel = new JPanel();
    private JPanel leftJPanel = new JPanel();
    private JPanel centerJPanel = new JPanel();
   
    private JLabel navnJLabel = new JLabel("Navn:");
    private JTextField navnJTextField = new JTextField();
   
       
   
    private JButton okJButton = new JButton("OK");
    private JButton lukJButton = new JButton("Luk");
   
    public Test() {
        super("Test");
       
        // initialisering
       
        // listener's
       
       
        okJButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //ikke vigtigt
            }
        });
       
        lukJButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
       
        // layout
       
        final int X = 5; // eXtra luft mellem komponenterne
       
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
       
        mainJPanel.setBorder(new EmptyBorder(X, X, X, X));
        mainJPanel.setLayout(new BorderLayout(X, X));
        getContentPane().add(mainJPanel, BorderLayout.NORTH);
       
        bottomJPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, X, X));
        getContentPane().add(bottomJPanel, BorderLayout.SOUTH);
       
        leftJPanel.setLayout(new GridLayout(0, 1, X, X));
        mainJPanel.add(leftJPanel, java.awt.BorderLayout.WEST);
       
        centerJPanel.setLayout(new GridLayout(0, 1, X, X));
        mainJPanel.add(centerJPanel, java.awt.BorderLayout.CENTER);
       
        leftJPanel.add(navnJLabel);
        centerJPanel.add(navnJTextField);
       
        bottomJPanel.add(okJButton);
        bottomJPanel.add(lukJButton);

        setLocation(100,100);
        setSize(150,100);
        setVisible(true);
       
    }
    /* Dette er en metode i JFrame, som sørger for, at alle componenter
    * i containeren, som er tilmeldt med addKeyListener() bliver kaldt.
    * Denne metoder overrides, og starter med et kald til superklassen.
    * Derved er du sikret, at andre componenter som du har tilmeldt også
    * bliver kaldt.
    */
    protected void processKeyEvent(KeyEvent e) {
        super.processKeyEvent( e );
      if ( e.VK_ESCAPE == e.getKeyChar() )
          System.exit( 0 );
    }
   
    public static void main(String[] args) {
        new Test();
    }
}
Avatar billede codemon Nybegynder
23. april 2002 - 17:42 #16
Du kan add'e den samme keylistener til alle dine objekter.

public class LukVedEscapeKeyListener extends KeyAdapter
{
public void keyTyped(KeyEvent e)
    {
      if ( e.VK_ESCAPE == e.getKeyChar() )
          System.exit( 0 );
    }
}

et objekt deraf add'es så til dine componenter.

fx
KeyListener lukVedESCObjekt = new LukVedEscapeKeyListener();
Components[] komponentArray = this.getComponents();

for (int i=0; i<komponentArray.length; komponentArray[i++].addKeyListener(lukVedESCObjekt));

Burde tilføje en KeyListener til alle GUI komponenterne.
Avatar billede birkis Nybegynder
28. april 2002 - 19:47 #17
Tak for al hjælp hidtil.

Jeg kigger på forslagene så snart jeg har tid, og vender så tilbage.
Avatar billede birkis Nybegynder
12. maj 2002 - 23:48 #18
Vel, jeg har nu haft tid til at kigge på det.

datamaker >> Jeg får det til at fungere hvis jeg har et kald til processKeyEvent(e) ved hver knap, textfield osv., men jeg håbet det skulle kunne la sig gøre med en metode som "fanger" hele JFrame.
Misforstår jeg hvad du mener?

codemon >> Den sidste ser spændende ud, men jeg tror ikke jeg forstår hvad der skal gøres - gider du at forklare lidt mere?
Avatar billede datamaker Nybegynder
13. maj 2002 - 00:24 #19
Har du husket super kaldet? Det er ikke meningen, at du skal tilmelde textfield, knapper ovs. Kun hvis de explicit skal have funktionalitet.
Det kode, som jeg har posted ovenfor, kan jeg køre.
Men ellers kan du prøve at sende mig din kode.
Avatar billede birkis Nybegynder
13. maj 2002 - 00:39 #20
"Det kode, som jeg har posted ovenfor, kan jeg køre."
Så er jeg nødt til at gøre noget forkert, desværre, fordi det kan jeg ikke...  Altså jeg kan køre den, men ESC fungerer ikke.
Avatar billede datamaker Nybegynder
13. maj 2002 - 19:35 #21
Send lige din kode.
Rfs@mail.tdcadsl.dk
Avatar billede birkis Nybegynder
19. juni 2002 - 17:46 #22
Beklager at jeg ikke har fået noget gjort med dette spm. - et par eksamener har taget det meste af min tid i det sidste. Nu rejser jeg hjem (til Norge) i morgen, og regner med at kunne kigge på dette i weekenden eller neste uge.

"I'll be back..."  ;-)
Avatar billede birkis Nybegynder
30. august 2002 - 00:43 #23
Nu har jeg endelig haft tid til at kigge lidt grundig på tingene.

Jeg er ked af det, men jeg får ingen af løsningerne til at fungere rigtigt.
Det ser ud for at jeg bliver nødt for at have en KeyListener på hvert komponent...  :-(
Avatar billede birkis Nybegynder
11. september 2002 - 23:16 #24
Nåh...

På trods af ekstra hjælp fra datamaker via mail, har jeg ikke fået det til at fungere helt som jeg ville.  Jeg har alligevel fået nogle idéer som jeg selv kan rode lidt mere med.

Mange tak for hjælp, begge.
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