希望有人能给我一些建议。我是Java的新手(1-2周)并且已经使用教程来实现这一点,但我尝试的任何东西都不允许我做(简单)任务。
当我单击GUI中的按钮发送时,我希望它在我输入到JTextField的GUI上的JTextArea中设置文本/添加文本。我在下面提供了我的代码,所以有人可以指导我到哪里出错。
package firstjavagui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class FirstJavaGui extends JPanel implements ActionListener {
private static ActionListener e;
protected JTextField tf;
protected JTextArea ta;
protected JButton send;
private final static String newL = "\n";
public FirstJavaGui() {
}
@Override
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
public class e implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String text = tf.getText();
if (send.isSelected()) {
ta.setText(text + newL);
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Thomas' first application");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(575,300);
JMenuBar mb = new JMenuBar();
JMenu m1 = new JMenu("File");
JMenu m2 = new JMenu("Help");
mb.add(m1);
mb.add(m2);
JMenuItem m21 = new JMenuItem("Save");
JMenuItem m22 = new JMenuItem("Exit");
m1.add(m21);
m1.add(m22);
JButton send = new JButton("Send");
JButton reset = new JButton("Start/Restart");
JLabel enter = new JLabel("Enter text here:");
JTextField text = new JTextField(25);
JPanel p = new JPanel();
p.add(enter);
p.add(text);
p.add(send);
p.add(reset);
JTextArea ta = new JTextArea();
frame.getContentPane().add(BorderLayout.SOUTH,p);
frame.getContentPane().add(BorderLayout.NORTH, mb);
frame.getContentPane().add(BorderLayout.CENTER, ta);
send.addActionListener(e);
frame.setVisible(true);
}
}
如果有人可以稍微帮助我,我们将不胜感激。
我认为这是因为我的所有按钮都在我的主要内部所以我的动作无法识别“发送”作为按钮...但是如果我在主方法之外编写我的gui它不会编译..我是新手,但我正在学习。只需要一只小手。
答案 0 :(得分:1)
欢迎使用Java。你可以使用你的代码到达那里,但是有一些小问题。
第一个问题围绕着“e”。你有两个叫e的东西,一个是一个类,一个是一个引用一个对象的变量:
// Reference to an object
private static ActionListener e;
...
// Class
public class e implements ActionListener{
...
现在,您永远不会为对象引用赋值,因此它将为null。对于ActionListeners,响应UI中事件的对象,这不是一个好主意。您需要创建一个实现ActionListener的类实例,以响应事件。这是一个典型的例子:
...
ExitListener listener = new ExitListener();
button.addActionListener(listener)
...
private class ExitListener implements ActionListener {
@Override
public void actionPerformed (ActionEvent e) {
System.exit(0);
}
}
ExitListener是一个ActionListener。为了响应事件,您需要创建一个ExitListener实例并将该实例传递给该按钮。顺便说一句,“e”是一个非常糟糕的类名 - 总是让你的类名描述。
第二个问题是经典,当他们从Java开始时,每个人都有这个问题。问题围绕着静态的使用。我不会详细介绍它,因为它是一个很大的主题,但基本上来自一个声明为静态的方法(例如main(...)),你只能访问类中声明为static的变量。对于静态变量,只有一个实际变量。对于非静态变量,每个类的实例都有一个变量。
基本上对于您的测试程序,您可以选择将所有内容设置为静态(包括当前名为“e”的类),或者您可以创建FirstJavaGui的实例,然后您可以使用非静态。