2016-11-19 3 views
2

Ich kann meinen Jframe nicht schließen, wenn ein Benutzer die (X) -Taste drückt. Ich habe viele Möglichkeiten ausprobiert, aber keiner von ihnen funktioniert.Jframe kann nicht geschlossen werden, wenn der Benutzer trifft (X)

Ich habe versucht:

JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

Nichts passiert. Meine Hauptklasse erweitert jframe und implementiert Aktionslistener. Was mache ich falsch?

Mein Code:

package com.xflare.Bot; 

import static java.lang.System.out; 
import java.awt.*; 
import java.lang.String; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JButton; 
import javax.swing.JFrame; 

public class Main extends JFrame implements ActionListener{ 

    private static Frame frame; 

    private static boolean debug = true; 

    private static boolean enabled = true; 

    private static JButton exitbutton; // reference to the button object 

    private static JButton webbutton; // reference to the button object 

    private static JButton aboutbutton; // reference to the button object 

    public static void main(String[] args) { 
     new Main().start(); 
    } 

    private void start(){ 
     //start up 
     printSystem("starting"); 

     //create frame 
     printSystem("Creating a frame..."); 
     createFrame(); 

     //create button(s) 
     createQuitButton(); 
     createWebButton(); 
     createAboutButton(); 

     //Spawn init. 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     getFrame().setResizable(false); 
     getFrame().setVisible(true); 
     printSystem("Started up successfully!"); 
    } 

    private void createFrame(){ 
     Main.frame = new Frame("app"); 
     frame.setSize(600, 300); 
    } 

    private void createQuitButton(){ 
     exitbutton = new JButton("Exit!"); 
     getFrame().setLayout(null); 
     exitbutton.setBounds(225,45,150,75);//setBounds(x,y,width,height) 
     exitbutton.setActionCommand("exit"); 
     exitbutton.addActionListener(this); 
     getFrame().add(exitbutton); 
    } 

    private void createWebButton(){ 
     webbutton = new JButton("Open hacked browser"); 
     getFrame().setLayout(null); 
     webbutton.setBounds(225,130,150,75);//setBounds(x,y,width,height) 
     webbutton.setActionCommand("web"); 
     webbutton.addActionListener(this); 
     getFrame().add(webbutton); 
    } 

    private void createAboutButton(){ 
     aboutbutton = new JButton("About"); 
     getFrame().setLayout(null); 
     aboutbutton.setBounds(225,215,150,75);//setBounds(x,y,width,height) 
     aboutbutton.setActionCommand("about"); 
     aboutbutton.addActionListener(this); 
     getFrame().add(aboutbutton); 
    } 

    private Frame getFrame(){ 
     return Main.frame; 
    } 

    public void actionPerformed(ActionEvent e) { 
     String actionCommand = ((JButton) e.getSource()).getActionCommand(); 
     printDebug("Button " + actionCommand + " was pressed."); 
     if(actionCommand.equals("exit")){ 
      exitbutton.setVisible(false); 
      shutdown(); 
     } 
     else if(actionCommand.equals("about")){ 
      aboutbutton.setVisible(false); 
      webbutton.setVisible(false); 
      exitbutton.setVisible(false); 
      showAbout(); 
     } 
     else{ 
      printCritical("Unknown button pressed!"); 
     } 
    } 

    private void showAbout(){ 

    } 

    private void shutdown(){ 
     printSystem("Attempting to shut down..."); 
     enabled = false; 
     printSystem("Shut down successful!"); 
     System.exit(0); 
    } 

    private boolean debugEnabled(){ 
     return debug; 
    } 

    private String getVersion(){ 
     return "1.0.0"; 
    } 

    private String getCodename(){ 
     return "[BeastReleased]"; 
    } 

    private static void printSystem(String var){ 
     out.println("System> " + var); 
    } 

    private static void printError(String var){ 
     out.println("Error> " + var); 
    } 

    private static void printCritical(String var){ 
     out.println("Critical> " + var); 
    } 

    private void printDebug(String var){ 
     if(debugEnabled()) { 
      out.println("Debug> " + var); 
     } 
    } 

} 

Link zur gleichen Code: http://pastebin.com/1fDbjm74

+1

Sie haben andere Schlüssel-Code, die Sie uns nicht zeigen, die wahrscheinlich auf dem Weg geetting ist. Sie müssen ein gültiges [mcve], ein kurzes Programm, erstellen und veröffentlichen, das kurz genug ist, um hier als Code-formatierter Text veröffentlicht zu werden, der kompiliert und Ihr Problem demonstriert. –

+0

Bearbeitete die Post. – javanumero

+0

Versuchen Sie, vor dem Aufrufen von setVisible() die standardmäßige Close-Operation festzulegen. –

Antwort

1

Dieses: setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Bedürfnisse auf dem JFrame genannt werden, die Sie tatsächlich anzeigt, Main.frame. Du machst das nicht.

getFrame().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
getFrame().setVisible(true); 

Sie haben zu viele Frame/JFrames. Ihre Klasse erweitert JFrame, aber Sie zeigen es nicht an. Sie haben auch eine Frame Variable namens frame, (NICHT eine JFrame-Variable), die Sie sind Anzeige, und natürlich, da dies kein JFrame ist, können Sie nicht JFrame Methodenaufrufe, wie die oben auf es.

Vereinfachen: Erstellen ONE JFrame nicht ein Frame, und rufen Sie diese Methode auf und legen Sie es sichtbar. Also entweder loswerden der Frame-Variable und verwenden Sie die Klasse selbst, die this, als Ihre JFrame, und zeigen Sie es, oder nicht Ihre Klasse erweitern JFrame und verwenden Sie Ihre Frame-Variable, aber machen es ein JFrame-Objekt nicht ein Frame-Objekt, da Frame nicht über die setDefaultCloseOperation(...)-Methode verfügt.

Auch Sie verwenden statische Modifikatoren wo sie nicht verwendet werden sollten. Alle Felder sollten Instanzfelder (nicht statisch) sein.

Auch die Verwendung von Null-Layouts und SetBounds wird Sie am Ende beißen. Zum Beispiel, wenn ich dein Programm starte, fehlen Teile des Textes der mittleren Taste, weil seine Größe künstlich eingeschränkt wurde. Viel besser ist uns Layout-Manager zu Ihrem Vorteil. Zum Beispiel: ....

haben Sie einen Blick auf diese Programmstruktur:

import java.awt.CardLayout; 
import java.awt.Component; 
import java.awt.Font; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 

import javax.swing.*; 

public class MyMain extends JPanel { 
    public static final String MENU_PANEL = "MENU"; 
    public static final String ABOUT_PANEL = "About"; 
    private CardLayout cardLayout = new CardLayout(); 

    public MyMain() { 
     JPanel aboutPanel = new JPanel(new GridBagLayout()); 
     JLabel aboutLabel = new JLabel("About"); 
     aboutLabel.setFont(aboutLabel.getFont().deriveFont(Font.BOLD, 32)); 
     aboutPanel.add(aboutLabel); 

     JPanel buttonPanel = new JPanel(new GridLayout(0, 1, 10, 10)); 
     buttonPanel.add(createButton(new ExitAction("Exit!", KeyEvent.VK_X))); 
     buttonPanel.add(createButton(new OpenBrowserAction("Open Hacked Browser", KeyEvent.VK_O))); 
     buttonPanel.add(createButton(new AboutAction("About", KeyEvent.VK_A, this)));   

     JPanel menuPanel = new JPanel(new GridBagLayout()); 
     int ebGap = 40; 
     menuPanel.setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, ebGap, ebGap)); 
     menuPanel.add(buttonPanel); 

     setLayout(cardLayout); 
     add(menuPanel, MENU_PANEL); 
     add(aboutPanel, ABOUT_PANEL); 
    } 

    private JButton createButton(Action action) { 
     JButton button = new JButton(action); 
     Font btnFont = button.getFont().deriveFont(Font.BOLD, 20); 
     button.setFont(btnFont); 
     return button; 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("My Main Application"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new MyMain()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    public void showPanel(String cardLayoutKey) { 
     cardLayout.show(this, cardLayoutKey); 
    } 
} 

class ExitAction extends AbstractAction { 
    public ExitAction(String name, int mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Component comp = (Component) e.getSource(); 
     if (comp != null) { 
      Window win = SwingUtilities.getWindowAncestor(comp); 
      if (win != null) { 
       win.dispose(); 
      } 
     } 
    } 
} 

class OpenBrowserAction extends AbstractAction { 
    public OpenBrowserAction(String name, int mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Open Browswer"); 
    } 
} 

class AboutAction extends AbstractAction { 
    private MyMain myMain; 

    public AboutAction(String name, int mnemonic, MyMain myMain) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
     this.myMain = myMain; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (myMain != null) { 
      myMain.showPanel(MyMain.ABOUT_PANEL); 
     } 
    } 
} 
+0

Ich habe versucht, unaufgelöst Symbol "setDefaultCloseOperation". – javanumero

+1

@javanumero: ** Nochmal ** bitte erstellen und posten Sie Ihre [mcve]. Du machst uns raten, was keinen Spaß macht. –

+0

Fertig. Ich habe den Beitrag bearbeitet. – javanumero

1

Sie rufen die setDefaultCloseOperation-Methode an der falschen Stelle auf. Hier ist, was Sie tun sollten:

private void start(){ 
    //start up 
    printSystem("starting"); 

    //create frame 
    printSystem("Creating a frame..."); 
    createFrame(); 

    //Spawn init. 
    getFrame().setResizable(false); 
    getFrame().setVisible(true); 
    printSystem("Started up successfully!"); 
} 

private void createFrame(){ 
    Main.frame = new Frame("app"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(600, 300); 
} 
+0

Ich versuchte, unaufgelöst Symbol "setDefaultCloseOperation". – javanumero

Verwandte Themen