0

なぜこれがコンパイルされないのか誰かが私に説明できるかどうか疑問に思っていますか?ユーザーが[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などのメソッドを利用できることに注意してください。setDefaultCloseOperationsetVisible


フレームを閉じるボタンを作成するには、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およびオーバーライドされているかに注目してください。とは、「「x」ボタンがクリックされたときに、クラスのメソッドで定義されたアクションを実行する、つまりフレームを閉じる」actionPerformedことを意味します。x.addActionListener(this)actionPerformed

于 2012-10-03T23:57:56.153 に答える
0

あなたが言っていることから、デフォルトのクローズ操作はの排他的な機能であるため、あなたBallWorldFrameはから拡張されていないように聞こえますJFrameJFrame

より簡単な例を試してください。

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デクレレーションは、私の例では、BallWorldFrameが私のメインクラスの内部クラスであるという事実から生じています。独自のクラスファイルに存在する場合BallWorldFrame、それは必要ありません。

于 2012-10-04T00:16:47.293 に答える