0

我想知道是否有人可以向我解释为什么我的 this 不会编译?当用户点击 [x] 按钮时,我试图在 java 中关闭一个框架。我不确定您是否需要 java 中的侦听器或类似的东西,但是由于我一直在查找这个问题,所以这似乎就是您所需要的。

import javax.swing.JFrame;

public class BallWorld
{
  public static void main( String[] args )
  {
    BallWorldFrame world = new BallWorldFrame();
    world.setDefaultCloseOperation(world.DISPOSE_ON_CLOSE);
    world.setVisible( true );

   }


  }
4

2 回答 2

1

这不起作用的原因是因为您的BallWorldFrame类没有您尝试调用的方法。尝试这个:

public class BallWorldFrame extends JFrame {
    ...
}

请注意,我们正在扩展JFrame,从而允许我们使用 和 等setDefaultCloseOperation方法setVisible


现在要创建一个关闭框架的按钮,您需要使用ActionListener. 您可以尝试这样的事情(将所有内容放在一个类中):

public class BallWorld extends JFrame implements ActionListener {

    private JButton x;

    public BallWorld() {
        x = new JButton("x");
        x.addActionListener(this);
        add(x);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new BallWorld();
    }

    public void actionPerformed(ActionEvent e) {
        dispose();  // close the frame
    }
}

请注意我们的类现在如何实现ActionListener和覆盖actionPerformed以关闭框架。,我们x.addActionListener(this)的意思是“当点击'x'按钮时,执行actionPerformed我们类的方法中定义的动作,即关闭框架”。

于 2012-10-03T23:57:56.153 回答
0

从您所说的来看,听起来您BallWorldFrame并没有从 a 扩展,JFrame因为默认关闭操作是JFrame

尝试一个更简单的例子:

public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {

            BallWorldFrame world = new BallWorldFrame();
            // All these compile and run without issue...
            world.setDefaultCloseOperation(world.DISPOSE_ON_CLOSE);
            world.setDefaultCloseOperation(BallWorldFrame.DISPOSE_ON_CLOSE);
            world.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            world.setVisible(true);

        }
    });

}

public static class BallWorldFrame extends JFrame {
}

nbstatic声明的原因是,在我的示例中, theBallWorldFrame是我的主类的内部类。如果您BallWorldFrame存在于它自己的类文件中,则不需要它。

于 2012-10-04T00:16:47.293 回答