1

actionListener および WindowListener イベントを使用する単純なアプリケーションに取り組んでいます。目的は、パネルに追加されたクリックされたボタンに従って default_close_operation を機能させることです。これは内部クラスを使用して簡単に実行できますが、リスナー イベントごとに異なるクラスを使用したいと考えています。コードは次のとおりです。

//test.java
import java.awt.event.WindowEvent;
import javax.swing.*;
public class test extends JFrame 
{
    public static void main(String args[])
    {
        new test();
    }

    private JButton button, exit;
    action a1 = new action();
    close c1 = new close();
    public test()
    {
        this.setSize(200,200);
        this.setTitle("test ");
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        button = new JButton("Button");
        exit = new JButton("Exit");
        exit.addActionListener(c1);
        button.addActionListener(a1);
        JPanel p1 = new JPanel();
        p1.add(button);
        p1.add(exit);
        this.add(p1);
    }

}

//action.java

import javax.swing.*;
import java.awt.event.*;
public class action extends WindowAdapter implements ActionListener
{
    JButton b1;

    public void actionPerformed(ActionEvent e)
    {
        b1 = (JButton)e.getSource();
        if(b1.getText().equalsIgnoreCase("button"))
        {
            b1.setText("Clicked");
        }
        else if(b1.getText().equalsIgnoreCase("exit"))
        {
            System.exit(0);
        }
    }
}

//close.java

import javax.swing.*;
import java.awt.event.*;
public class close extends WindowAdapter
{
    public void windowClosing(WindowEvent e)
    {
        exit.doClick(); //WRONG as no variable exists with exit name.
    }
}

close.java クラス以外はすべて問題ありません。プログラムが正しい方法で終了するように、WindowClosing メソッドをアクション クラスにポイントするにはどうすればよいですか?

4

2 に答える 2

0

このような独自のアクションリスナーで操作を実行するには、JFrame が必要です

public class MyListener extends WindowAdapter implements ActionListener
{

    JFrame frame ;
    public MyListener(JFrame component) {
        this.frame = component;
    }


    @Override
    public void actionPerformed(ActionEvent e)
    {
        String actionCommand = e.getActionCommand();
        if(actionCommand.equals("Exit")) {
            //When the last displayable window within the Java virtual 
            // machine (VM) is disposed of, the VM may terminate
            frame.dispose();
        }
    }

    @Override
    public void windowClosing(WindowEvent e) {
             // perfrom operation after window closed
        Component component = e.getComponent();
        String name = component.getName();
        System.out.println("Component " + name + " is closing");

    }


    @Override
    public void windowClosed(WindowEvent e) {
        System.out.println("window is closed");
    }

}

フレームとボタンにリスナーを追加する

    JFrame frame = new JFrame("Test Frame");   
    buttonExit = new JButton("Exit");
    listener = new MyListener(this);
    frame.addWindowListener(listener);
    buttonExit.addActionListener(listener);
于 2012-12-30T12:20:18.487 に答える
0

Action クラスに対して行ったのと同じ方法で ActionListener を拡張し、Action.java で処理した方法を終了できます。

//from your code
else if(b1.getText().equalsIgnoreCase("exit"))
    {
        System.exit(0);
    }
于 2012-12-30T10:40:13.467 に答える