Miten saan JButtoniin toiminnallisuuden, eli sulkeutumaan (lopettamaan ohjelman suorituksen) kyseistä painiketta painamalla?
Swing-ongelma
avuton
4362
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 4
Vanhimmat
ohjelmahan kuolee kun pistää
System.exit(lopetusarvo);
esim System.exit(0);
Napin saa kuuntelemaan tapahtumia (event) kun siihen liittää tapahtumankuuntelijan.
Tässä esim luokka joka pistää napin ikkunalle ja lisää napin kuuntelijaksi luokan itsensä. Luokan pitää siis toteuttaa myös tapahtumien kuuntelemiseen liittyvät metodit
public class NamiskaTesti extends JFrame implements ActionListener
{
JButton namiska;
JPanel contentpane;
public NamiskaTesti()
{
//ilman allaolevaa ruksista suljetut ikkunat jää päälle
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
namiska = new JButton("Lopeta");
contentpane = new JPanel();
//nappia kuuntelee luokka itse
namiska.addActionListener(this);
contentpane.add(namiska);
this.setContentPane(contentpane);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
//jotain tehtiin. Tuliko tapahtuma napista?
if(e.getSource() = this.namiska)
(//jep napille tehtiin jotain
System.exit(0);
)
}
}
Eli tämmöiset löytyy:
public void windowClosed(WindowEvent e){ System.exit(0); }
if (e.getSource() == close){
Main.lopetus1();
ja Mainissa se näyttää
public static void lopetus() {
sovellus.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
System.exit(0);
}
eli sovellus.set jälkeen pitää tulla jotain muuta, mutta mitä? kun tuo nykyinen viittaa siihen yläkulman sulkemisruksiin, mutta painikkeena ei toimi.. ja add.napit ja muut toimii, mutta tuolle sovellus.set:lle täytyy tulla jotain muuta, mutta mitä?
Ei kannata sohia noita System.exit(0) ihan minne sattuu ja niin monta kun vaan kerkee. Kohta alkaa sovellus kaatuileen ja et enää tiedän missä se sulkeutuu.
sovellus.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
toi edellinen määrää mitä tapahtuu ikkunan ylänurkassa olevasta ruksista. Eli ton setin teet vain kerran ikkunaluokan konstruktorissa. Ei sitte tartte asettaa joka kerta kun nappia painetaan.
Sitten pitää saada vielä se lopetus siihen nappiin. Sen voit tehdä samaan tapaan kun antamassani malliluokassa.
PS.
windowClosed-eventin lähettää ikkuna itse eikä mikään nappi. Et saa siis nappia kiinni kutsumalla if (e.getSource() == close)
Tässä olisi yksi testattu "rautalankaversio". Napin kuuntelu on kylläkin hiukan hämärän näköinen, mutta toimiva.
import java.awt.event.*;
import javax.swing.*;
public class NewClass extends JFrame{
public NewClass() {
JPanel paneli = new JPanel();
JButton lopeta = new JButton("Lopeta");
paneli.add(lopeta);
this.add(paneli);
lopeta.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(500,200);
this.setVisible(true);
}
public static void main(String args[]) {
new NewClass();
}
}