Как заставить кнопку в одном классе влиять на текстовую область в другом? - PullRequest
1 голос
/ 25 марта 2019

Пожалуйста, помогите мне понять, как это работает. У меня возникают трудности с пониманием того, как, например, JButton в одном классе может изменить текст в JTextArea, который находится в другом классе того же пакета. Я сделал простое приложение просто для того, чтобы задать вопрос, мне это нужно для большого школьного проекта, где мне нужно реализовать это для работы с несколькими классами.

Когда я помещаю все в один класс, это работает, но мне нужно это в отдельных классах.

Вот простой код.

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

class Button extends JPanel {

    private JButton button;
    private Panel panel;

    public Button() {
        button = new JButton("BUTTON");
        panel = new Panel();
        add(button);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JButton clicked = (JButton) e.getSource();
                String input = clicked.getText();
                panel.setTextArea(input);
                //System.out.println(input);
            }
        });
    }
}

class Panel extends JPanel {

    private JTextArea textArea;

    public Panel() {
        setLayout(new BorderLayout());
        textArea = new JTextArea();
        add(textArea, BorderLayout.CENTER);
    }

    public JTextArea getTextArea() {
        return textArea;
    }

    void setTextArea(String text) {
        this.textArea.setText(text);
    }
}

public class Java extends JFrame {

    private Button dugme;
    private JFrame frame;
    private Panel panel;

    public Java() {
        frame = new JFrame();
        dugme = new Button();
        panel = new Panel();
        //super("test");
        frame.setLayout(new BorderLayout());
        frame.setTitle("test");
        frame.setSize(300, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.add(dugme, BorderLayout.NORTH);
        frame.add(panel, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        Java app = new Java();
    }
}

Я хочу, чтобы слушатель действия изменил текст на панели, sys-out работает так, что слушатель слушает кнопку, но я не могу изменить текст в текстовой области.

1 Ответ

1 голос
/ 25 марта 2019

Как уже упоминалось @XtremeBaumer, у вас есть два разных экземпляра класса Panel. Вам нужно удалить один код.

public class Button extends JPanel {
    private JButton button;
    private Panel panel;
    public Button(Panel panel) { // we need already created instance of panel here.
        this.panel = panel;
        button = new JButton("BUTTON");
        // panel = new Panel(); <-- this line must be deleted.
        // ...
    }
}
public class Java extends JFrame {
    private Button dugme;
    private JFrame frame;
    private Panel panel;
    public Java(){
        frame = new JFrame();
        panel = new Panel();
        dugme = new Button(panel);
        // ...
    }
}

Пожалуйста, также замените строку

add(textArea, BorderLayout.CENTER);

от

add(new JScrollPane(textArea), BorderLayout.CENTER);

Это позволяет вам получать полосы прокрутки, когда текст превышает размер текста.

Вот ваш переработанный пример

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

class Button extends JPanel {

    private JButton button;
    private Panel panel;

    public Button(Panel panel) {
        this.panel = panel;
        button = new JButton("BUTTON");
        add(button);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JButton clicked = (JButton) e.getSource();
                String input = clicked.getText();
                panel.setTextArea(input);
                //System.out.println(input);
            }
        });
    }
}

class Panel extends JPanel {

    private JTextArea textArea;

    public Panel() {
        setLayout(new BorderLayout());
        textArea = new JTextArea();
        add(new JScrollPane(textArea), BorderLayout.CENTER);
    }

    public JTextArea getTextArea() {
        return textArea;
    }

    void setTextArea(String text) {
        this.textArea.setText(text);
    }
}

public class Java extends JFrame {

    private Button dugme;
    private JFrame frame;
    private Panel panel;

    public Java() {
        frame = new JFrame();
        panel = new Panel();
        dugme = new Button(panel);
        //super("test");
        frame.setLayout(new BorderLayout());
        frame.setTitle("test");
        frame.setSize(300, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.add(dugme, BorderLayout.NORTH);
        frame.add(panel, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        Java app = new Java();
    }
}
...