0

私は参加したばかりで、ここに来てよかったです~ それで、今朝 (午前 2 時くらいですが、それは重要なことではありません :P ) JFrame やその他の GUI を使って Java のテストを少し行っていました。GUI を扱うのはこれが初めてです。私は、夢のジャーナラーとして機能する小さな Java アプリを作成しようとしていました。しかし、解決できない問題に遭遇したとき、私の進行は凍結されました。私のコードは次のとおりです。

import java.awt.*;
import javax.swing.*;
import java.applet.*;

public class Display extends Canvas
{
    static final int WIDTH = 600;
    static final int HEIGHT = 400;
    public static String defaultEntry = "Dreams...";
    public static final String TITLE = "Dream Journal Testing";

    Button erase;

    public static void main(String[] args)
    {
        Display d = new Display();
        d.create();

    }

    public void create()
    {
        JFrame frame = new JFrame();
        System.out.println("Running");


        Panel cardOne = new Panel();
        Panel p1 = new Panel();
        Panel p2 = new Panel();
        Panel p3 = new Panel();
        Panel grid = new Panel();


        cardOne.setLayout(new BorderLayout());
        p1.setLayout(new GridLayout(2,1,3,6));
        TextArea textArea1 = new TextArea(defaultEntry);

        /*Font f1 = new Font("Courier", Font.PLAIN, 16);
        setFont(f1);*/
        Label l1 = new Label("Welcome to the Dream Journal! :)");
    Label l2 = new Label("Type your dream below:");
    p1.add(l1);
    p1.add(l2);



    p2.add(textArea1);

    p3.setLayout(new FlowLayout(FlowLayout.CENTER));

    Button ok = new Button("Save");
    erase = new Button("Erase");
    p3.add(erase);
    p3.add(ok);


    cardOne.add("North",p1);
    cardOne.add("Center",p2);
    cardOne.add("South",p3);

    frame.add(cardOne);
    //frame.add(cardOne);
    //frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setTitle(TITLE);
    frame.setSize(WIDTH, HEIGHT);
    frame.setResizable(false);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    System.out.println(textArea1.getText());

}

/*public boolean handleEvent(Event evt)
{
    if(evt.target == erase)
    {
        System.out.println("it works");
        return true;
    }

    else return super.handleEvent(evt);
}
*/  
public boolean action(Event evt, Object arg)
{
    if("Erase".equals(arg))
    {
        System.out.println("hello");
        //textArea1.setText("");
    }
    return true;
}   
}

私が抱えている問題は、「消去」AWTボタンを押すと、システムが(テストとして)行を印刷する方法がわからないことです。public boolean action(Event evt, Object arg) と public boolean handleEvent を試しましたが、どちらも機能しませんでした。私である Java 初心者に何か提案はありますか? ありがとう!!:)

4

3 に答える 3

2

1 つの方法は、ボタンにアクション リスナーを追加することです (例: 用Save)。もう 1 つの方法はAction(たとえば for Erase) を作成することです。


必要でない限り、Swing と AWT コンポーネントを混在させないでください。現時点では、AWT コンポーネントの使用方法を学習する価値さえありません。Swing は、最良の結果と最良の支援のためにのみ使用してください。

アプリ版はこちら。すべての Swing コンポーネントを使用します。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Display 
{
    static final int WIDTH = 600;
    static final int HEIGHT = 400;
    public static String defaultEntry = "Dreams...";
    public static final String TITLE = "Dream Journal Testing";

    JButton erase;

    public static void main(String[] args)
    {
        Display d = new Display();
        d.create();
    }

    public void create()
    {
        JFrame frame = new JFrame();
        System.out.println("Running");

        JPanel cardOne = new JPanel();
        JPanel p1 = new JPanel();
        JPanel p2 = new JPanel();
        JPanel p3 = new JPanel();

        cardOne.setLayout(new BorderLayout());
        p1.setLayout(new GridLayout(2,1,3,6));
        JTextArea textArea1 = new JTextArea(defaultEntry);

        JLabel l1 = new JLabel("Welcome to the Dream Journal! :)");
        JLabel l2 = new JLabel("Type your dream below:");
        p1.add(l1);
        p1.add(l2);

        p2.add(textArea1);

        p3.setLayout(new FlowLayout(FlowLayout.CENTER));

        JButton ok = new JButton("Save");
        ok.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                System.out.println("Do " + ae.getActionCommand());
            }
        });
        erase = new JButton(new EraseAction());
        p3.add(erase);
        p3.add(ok);

        // Use the constants
        cardOne.add(BorderLayout.PAGE_START,p1);
        cardOne.add(BorderLayout.CENTER,p2);
        cardOne.add(BorderLayout.PAGE_END,p3);

        frame.add(cardOne);
        frame.pack();
        frame.setTitle(TITLE);
        frame.setSize(WIDTH, HEIGHT);
        frame.setResizable(false);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        System.out.println(textArea1.getText());
    }
}

class EraseAction extends AbstractAction {

    EraseAction() {
        super("Erase");
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        System.out.println("Do " + arg0.getActionCommand());
    }
}
于 2012-08-01T01:59:43.987 に答える
2

まず、Event Handler の Funda について説明させてください....

-まず、イベント ソースでEvent Source何らかのアクションが発生すると、メソッドEvent Objectに がスローされます。call back

- Call Back method は、この Listener を実装する によって実装される必要がある (Interface)内のメソッドです。 ListenerClass

-このコールバック メソッド内のステートメントは、イベント ソースでアクションが実行されたときに、何を実行する必要があるかを指示します。

例えば:

推定

  Event Source - Button
  When Clicked - Event object is thrown at the call back method
  Call back method - actionPerformed(ActionEvent e) inside ActionListener.

今あなたのケース:

これは2つの方法で行うことができます.....

1.Displayクラスに を実装させ、ActionListenerに を登録buttonActionListener最後に ActionListenerの抽象メソッドを実装します。 actionPerformed()

例えば:

    public class Display extends Canvas implements ActionListener{


    public Display(){

    // Your code....

       setComponent();            // Initializing the state of Components 
     }


    public void setComponent(){

        // Your code.........

       Button b = new Button("Click");
       b.addActionListener(this);        // Registering the button.

       // Your code..........

          }

    public void actionPerformed(ActionEvent event) {

       // Do here whatever you want on the Button Click

     }


  }

2.Anonymousクラスを使用します。

-匿名クラスの宣言と初期化が同時に行われます。

-匿名クラスは、1 つまたはrespのみを実装または拡張する必要があります。 interfaceclass

Display クラスはここに ActionListener を実装しません....

public class Display extends Canvas {


    public Display(){

    // Your code....

       setComponent();            // Initializing the state of Components 
     }


    public void setComponent(){

        // Your code.........

       Button b = new Button("Click");
                                       // Registering the button and Implementing it

        b.addActionListener(new ActionListener(){

          public void actionPerformed(ActionEvent event) {

                // Do here whatever you want on the Button Click
            }


         }); 

       // Your code..........

          }




  }
于 2012-08-01T03:14:55.273 に答える
1

実装する必要がありますActionListner:

public class Display extends Canvas implements ActionListener

次のようにボタンに自分自身を追加します。

  erase.addActionListener(this);

次に、必要なメソッドを実装します。

public void actionPerformed(ActionEvent event) {
    //do stuff
}

詳細については、ActionListeners の作成に関するこのチュートリアルを確認してください。この観察可能なパターンは、Java GUI で広く使用されていることがわかります。


いくつかの高レベルの批評:

  1. 多くの古い AWT コンポーネント (つまりButton) を使用していますが、類似しているが新しい (より柔軟な) Swing コンポーネント (つまりJButton) が利用可能です。違いの簡単な説明については、これを見てください。
  2. あなたが実装したイベント モデルは、1997 年に、私が上で提案した観察可能なパターンに刷新されました。詳細については、こちらをお読みください
于 2012-08-01T01:31:48.993 に答える