用户点击时不能让Jframe关闭(X)

时间:2016-11-19 18:20:04

标签: java

当用户点击(X)按钮时,我无法关闭我的Jframe。我尝试了很多方法,但没有一种方法可以工作。

我试过了:

JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

什么都没发生。我的主类扩展了jframe并实现了动作监听器。我做错了什么?

我的代码:

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);
        }
    }

}

链接到相同的代码:http://pastebin.com/1fDbjm74

2 个答案:

答案 0 :(得分:1)

这:setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

需要在您实际显示的JFrame上调用Main.frame。你不这样做。

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

你有太多的Frame / JFrame。您的类扩展了JFrame,但您没有显示它。您还有一个名为Frame的{​​{1}}变量,(一个JFrame变量) 显示,当然也是这不是JFrame,您无法进行JFrame方法调用,就像上面的那样。

简化:创建 ONE JFrame而不是框架,并在其上调用此方法并将其设置为可见。因此,要么摆脱框架变量并使用类本身,frame作为您的JFrame,并显示它,或者不要让您的类扩展JFrame并使用您的框架变量,但要使其成为JFrame对象不是一个Frame对象,因为Frame没有this方法。

此外,您过度使用不应使用的静态修饰符。您的所有字段都应该是实例(非静态)字段。

另外,使用null布局和setBounds最终会让你感到困惑。例如,当我运行你的程序时,中间按钮的部分文本丢失了,因为它的大小被人为地限制在一个糟糕的方式。更好的是我们布局经理对您有利。例如:....

请看一下这个程序结构:

setDefaultCloseOperation(...)

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");
    }
}

答案 1 :(得分:1)

您正在错误的地方调用setDefaultCloseOperation方法。这是你应该做的:

asPromise()