Как я могу добавить текст в JTextArea с собственным классом ActionListener после нажатия кнопок

Эй, я хочу 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 напишет, какая кнопка была нажата, но после нажатия ничего не происходит. Ошибки не выскакивают.

В названиях ваших кнопок есть пробелы. Проверки вашего слушателя не учитывают пространство.

Vince 28.05.2019 18:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытался скомпилировать ваш код на 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);
    }
}
}

Большое спасибо! Таким образом, я в основном испортил некоторые детали и пересмотрел их.

Francis Drake 28.05.2019 19:00

@FrancisDrake Пожалуйста, проголосуйте и выберите ответ как принятый. Спасибо

Rishabh Kumar 28.05.2019 20:06

Другие вопросы по теме