我刚刚加入,很高兴能够来到这里〜所以,今天早上(凌晨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菜鸟有什么建议吗?谢谢!! :)
答案 0 :(得分:2)
一种方法是向按钮添加动作侦听器(例如,对于 Save )。另一种方法是创建Action
(例如, 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());
}
}
答案 1 :(得分:2)
首先让我解释一下事件处理程序的Funda ....
- 首先有Event Source
,当事件来源发生任何操作时,会向Event Object
投掷call back
{1}} 方法。
- Call Back
方法是 Listener
(接口)中的方法需要实施由实现此监听器的Class
。
- 此回调方法中的语句将指示在事件源上执行操作时需要完成的操作。
<强>例如强>
假设
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
,然后注册 button
同
ActionListener
,最后实现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
课程。
- 匿名类是同时声明和初始化。
- 匿名类必须实施或扩展至只有一个 interface
或class
resp。
你的显示类不会在这里实现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..........
}
}
答案 2 :(得分:1)
您需要实施ActionListner
:
public class Display extends Canvas implements ActionListener
并将您自己添加到按钮中:
erase.addActionListener(this);
然后实现所需的方法:
public void actionPerformed(ActionEvent event) {
//do stuff
}
有关详细信息,请查看this tutorial on creating ActionListeners。 您会发现这个可观察的模式在Java GUI中被广泛使用。
一些高级别的批评:
Button
),您正在使用许多较旧的AWT组件(即JButton
)。 Take a look at this快速解释差异。