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 按钮,系统将打印一行(作为测试)。我已经尝试过公共布尔操作(事件 evt,对象 arg)和公共布尔句柄事件,但都没有奏效。有人对我这个 Java 菜鸟有什么建议吗?谢谢!!:)

4

3 回答 3

2

一种方法是为按钮添加一个动作监听器(例如 for Save)。另一种方法是创建一个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 Source任何操作时,都会向方法Event Object抛出一个。call back

- Call Back方法是(接口)内部的方法, 需要由实现此侦听器的方法实现。ListenerClass

-当对事件源执行操作时,此回调方法中的语句将指示需要做什么。

例如:

认为

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

现在你的情况:

现在这可以通过两种方式完成......

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类。

-匿名类同时声明和初始化。

-匿名类必须实现或扩展只有一个 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. Button当有类似但更新的(阅读:更灵活)Swing 组件(即)时,您正在使用许多较旧的 AWT 组件(即JButton)。看一下这个以快速解释差异。
  2. 您实现的事件模型在 1997 年被修改为我上面建议的可观察模式。如果您想了解更多信息,可以阅读此内容
于 2012-08-01T01:31:48.993 回答