Эй, я хочу JFrame с кнопками "LeftButton" и "RightButton" и JTextArea. После того, как я нажму одну из двух, я хочу, чтобы JTextArea писал, какие кнопки были нажаты в новой строке. Для этого я хочу использовать класс MyActionListener со ссылками на JTextArea, который реализует Actionlistener.
Я попытался дать ActionPerformed JTextArea и понял, что мне нужно создавать сеттеры самостоятельно. Затем я понял, что для класса MyActionListener требуется также объект, такой как JTextArea, который такой же, как в классе JFrame. Затем я узнал, что мне также нужно обновить JTextArea в классе JFrame, и здесь я немного застрял прямо сейчас. Я безуспешно пытался поместить сеттеры в класс JFrame и вызвать их из 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 напишет, какая кнопка была нажата, но после нажатия ничего не происходит. Ошибки не выскакивают.
Я попытался скомпилировать ваш код на JDK8, он выдал ошибки, и я вижу, что у него мало проблем.
Прежде всего это:
MAL = new MyActionListener(south);
south = new JTextArea(5, 20);
south.setEditable(false);
Вы передаете Null в качестве параметра вашему слушателю. Вы должны сначала инициализировать «юг», прежде чем передавать его в конструкторе в MAL. Также у кнопки не было никакого метода, как у getString. У него есть getLabel или getText для JButton. Также, как сказал @vince, добавьте пробел в «LeftButton». Я немного подправил ваш код. Ниже приведен рабочий код. Для простоты я добавил пользовательский прослушиватель в тот же файл и заменил кнопку на JButton (вы уже используете JFrame свинга, поэтому лучше попробуйте использовать все компоненты свинга). Вы получите суть с этим:
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);
}
}
}
Большое спасибо! Таким образом, я в основном испортил некоторые детали и пересмотрел их.
@FrancisDrake Пожалуйста, проголосуйте и выберите ответ как принятый. Спасибо
В названиях ваших кнопок есть пробелы. Проверки вашего слушателя не учитывают пространство.