按下按钮后如何使用自己的 ActionListener Class 将文本附加到 JTextArea
How can I append Text to JTextArea with an own ActionListener Class after pressing Buttons
嘿,我想要一个 JFrame,它必须包含按钮 "LeftButton" 和 "RightButton" 以及一个 JTextArea。在我按下两者之一之后,我希望 JTextArea 在新的一行中写入哪些按钮已被按下。为了做到这一点,我想使用 MyActionListener Class 和 JTextArea 的 Referens,它实现了 Actionlistener。
我曾尝试为 ActionPerformed 提供 JTextArea,但意识到我必须自己创建 Setters。然后我意识到 MyActionListener Class 还需要一个像 JTextArea 这样的对象,它与 JFrame Class 中的对象相同。然后我发现我还必须更新 JFrame class 中的 JTextArea,现在我有点卡住了。我试图将 Setters 放入 JFrame Class 并从 MyActionListener 调用它们但没有成功,我尝试做类似 A_18_c.south = south
的事情
package Aufgabe_18;
import javax.swing.*;
import java.awt.*;
public class A_18_c extends JFrame {
private Button LeftButton;
private Button RightButton;
private JScrollPane scroll;
private JTextArea south;
private MyActionListener MAL;
public static void main(String[] args) {
A_18_c l = new A_18_c("Aufgabe18c");
}
public A_18_c(String title) {
super(title);
setSize(300, 150);
this.setLocation(300, 300);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
MAL = new MyActionListener(south);
south = new JTextArea(5, 20);
south.setEditable(false);
JScrollPane sroll = new JScrollPane(south);
this.add(sroll, BorderLayout.SOUTH);
LeftButton = new Button("Left Button");
LeftButton.setOpaque(true);
LeftButton.addActionListener(MAL);
this.add(LeftButton, BorderLayout.WEST);
RightButton = new Button("Right Button");
RightButton.setOpaque(true);
RightButton.addActionListener(MAL);
this.add(RightButton, BorderLayout.EAST);
setVisible(true);
}
}
MyActionListener:
package Aufgabe_18;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyActionListener implements ActionListener{
private final JTextArea south;
public MyActionListener(JTextArea south)
{
this.south = south;
}
private void setTextLeftButton(JTextArea south){
south.append("Left Button \n");
}
private void setTextRightButton(JTextArea south){
south.append("Right Button \n");
}
@Override
public void actionPerformed(ActionEvent e) {
String a;
Object src = e.getSource();
Button b = null;
b = (Button) src;
a = b.getString();
if (a == "LeftButton")
setTextRightButton(south);
if (a == "RightButton")
setTextRightButton(south);
}
}
我希望 JTextArea 写下哪个 Button 被按下,但按下后没有任何反应。没有弹出错误。
我试过在 JDK8 上编译你的代码,它给出了错误,我可以看到它有一些问题。
首先是这个:
MAL = new MyActionListener(south);
south = new JTextArea(5, 20);
south.setEditable(false);
您正在将 Null 作为参数传递给您的侦听器。在将构造函数传递给 MAL 之前,您必须先初始化 "south"。此外,Button 没有任何方法作为 getString。它具有用于 JButton 的 getLabel 或 getText。另外正如@vince 所说,在 "LeftButton" 中添加 space。我对你的代码做了一些调整。下面是工作代码。为简单起见,我在同一个文件中添加了自定义监听器,并将 Button 替换为 JButton(您已经在使用 swing 的 JFrame,因此最好尝试使用所有 swing 组件)。您将了解要点:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
public class Test extends JFrame {
private JButton LeftButton;
private JButton RightButton;
private JScrollPane scroll;
private JTextArea south;
private MyActionListener MAL;
public static void main(String[] args) {
Test l = new Test("Aufgabe18c");
}
public Test(String title) {
super(title);
setSize(300, 150);
this.setLocation(300, 300);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
//initialize south
south = new JTextArea(5, 20);
south.setEditable(true);
//pass it to your Listener
MAL = new MyActionListener(south);
JScrollPane scroll = new JScrollPane(south);
this.add(scroll, BorderLayout.SOUTH);
LeftButton = new JButton("Left Button");
LeftButton.setOpaque(true);
LeftButton.addActionListener(MAL);
this.add(LeftButton, BorderLayout.WEST);
RightButton = new JButton("Right Button");
RightButton.setOpaque(true);
RightButton.addActionListener(MAL);
this.add(RightButton, BorderLayout.EAST);
setVisible(true);
}
public class MyActionListener implements ActionListener{
private final JTextArea south;
public MyActionListener(JTextArea south)
{
this.south = south;
}
private void setTextLeftButton(JTextArea south){
south.append("Left Button \n");
}
private void setTextRightButton(JTextArea south){
south.append("Right Button \n");
}
@Override
public void actionPerformed(ActionEvent e) {
String a;
Object src = e.getSource();
JButton b = null;
b = (JButton) src;
a = b.getText();
if (a == "Left Button")
setTextLeftButton(south);
else
setTextRightButton(south);
}
}
}
嘿,我想要一个 JFrame,它必须包含按钮 "LeftButton" 和 "RightButton" 以及一个 JTextArea。在我按下两者之一之后,我希望 JTextArea 在新的一行中写入哪些按钮已被按下。为了做到这一点,我想使用 MyActionListener Class 和 JTextArea 的 Referens,它实现了 Actionlistener。
我曾尝试为 ActionPerformed 提供 JTextArea,但意识到我必须自己创建 Setters。然后我意识到 MyActionListener Class 还需要一个像 JTextArea 这样的对象,它与 JFrame Class 中的对象相同。然后我发现我还必须更新 JFrame class 中的 JTextArea,现在我有点卡住了。我试图将 Setters 放入 JFrame Class 并从 MyActionListener 调用它们但没有成功,我尝试做类似 A_18_c.south = south
package Aufgabe_18;
import javax.swing.*;
import java.awt.*;
public class A_18_c extends JFrame {
private Button LeftButton;
private Button RightButton;
private JScrollPane scroll;
private JTextArea south;
private MyActionListener MAL;
public static void main(String[] args) {
A_18_c l = new A_18_c("Aufgabe18c");
}
public A_18_c(String title) {
super(title);
setSize(300, 150);
this.setLocation(300, 300);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
MAL = new MyActionListener(south);
south = new JTextArea(5, 20);
south.setEditable(false);
JScrollPane sroll = new JScrollPane(south);
this.add(sroll, BorderLayout.SOUTH);
LeftButton = new Button("Left Button");
LeftButton.setOpaque(true);
LeftButton.addActionListener(MAL);
this.add(LeftButton, BorderLayout.WEST);
RightButton = new Button("Right Button");
RightButton.setOpaque(true);
RightButton.addActionListener(MAL);
this.add(RightButton, BorderLayout.EAST);
setVisible(true);
}
}
MyActionListener:
package Aufgabe_18;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyActionListener implements ActionListener{
private final JTextArea south;
public MyActionListener(JTextArea south)
{
this.south = south;
}
private void setTextLeftButton(JTextArea south){
south.append("Left Button \n");
}
private void setTextRightButton(JTextArea south){
south.append("Right Button \n");
}
@Override
public void actionPerformed(ActionEvent e) {
String a;
Object src = e.getSource();
Button b = null;
b = (Button) src;
a = b.getString();
if (a == "LeftButton")
setTextRightButton(south);
if (a == "RightButton")
setTextRightButton(south);
}
}
我希望 JTextArea 写下哪个 Button 被按下,但按下后没有任何反应。没有弹出错误。
我试过在 JDK8 上编译你的代码,它给出了错误,我可以看到它有一些问题。
首先是这个:
MAL = new MyActionListener(south);
south = new JTextArea(5, 20);
south.setEditable(false);
您正在将 Null 作为参数传递给您的侦听器。在将构造函数传递给 MAL 之前,您必须先初始化 "south"。此外,Button 没有任何方法作为 getString。它具有用于 JButton 的 getLabel 或 getText。另外正如@vince 所说,在 "LeftButton" 中添加 space。我对你的代码做了一些调整。下面是工作代码。为简单起见,我在同一个文件中添加了自定义监听器,并将 Button 替换为 JButton(您已经在使用 swing 的 JFrame,因此最好尝试使用所有 swing 组件)。您将了解要点:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
public class Test extends JFrame {
private JButton LeftButton;
private JButton RightButton;
private JScrollPane scroll;
private JTextArea south;
private MyActionListener MAL;
public static void main(String[] args) {
Test l = new Test("Aufgabe18c");
}
public Test(String title) {
super(title);
setSize(300, 150);
this.setLocation(300, 300);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
//initialize south
south = new JTextArea(5, 20);
south.setEditable(true);
//pass it to your Listener
MAL = new MyActionListener(south);
JScrollPane scroll = new JScrollPane(south);
this.add(scroll, BorderLayout.SOUTH);
LeftButton = new JButton("Left Button");
LeftButton.setOpaque(true);
LeftButton.addActionListener(MAL);
this.add(LeftButton, BorderLayout.WEST);
RightButton = new JButton("Right Button");
RightButton.setOpaque(true);
RightButton.addActionListener(MAL);
this.add(RightButton, BorderLayout.EAST);
setVisible(true);
}
public class MyActionListener implements ActionListener{
private final JTextArea south;
public MyActionListener(JTextArea south)
{
this.south = south;
}
private void setTextLeftButton(JTextArea south){
south.append("Left Button \n");
}
private void setTextRightButton(JTextArea south){
south.append("Right Button \n");
}
@Override
public void actionPerformed(ActionEvent e) {
String a;
Object src = e.getSource();
JButton b = null;
b = (JButton) src;
a = b.getText();
if (a == "Left Button")
setTextLeftButton(south);
else
setTextRightButton(south);
}
}
}