Один класс вызывает метод другого

#java #user-interface #methods #method-call

#java #пользовательский интерфейс #методы #метод-вызов

Вопрос:

В попытке привести в порядок свой (очень простой) код пользовательского интерфейса я разделил кнопку и текстовое поле на два отдельных класса, с основным для создания фрейма и запуска. Кнопка должна влиять на содержимое текстового поля при нажатии, поэтому я использовал mouseEvent . Однако я не могу вызвать метод моего текстового поля, поскольку объект текстового поля хранится в main, поэтому нет объекта, для которого можно использовать метод. Все методы являются общедоступными, а все атрибуты являются частными. Вся помощь приветствуется, спасибо.

Я пытался создать объект public statiic безрезультатно, я не уверен, есть ли что-то очевидное, чего мне здесь не хватает.

Для контекста mouseEvent необходимо вызвать метод rename(String) из объекта текстового поля, известного как tf, в классе gui1

редактировать:
(основной)

 public interface gui1{
    public static void main(String[] args) {

        textfieldobj tf = new textfieldobj("You should press button 1",100,100, 150,20);   
        buttonObject b = new buttonObject("new button!");
 

(в классе buttonObject)

 public class buttonObject extends JButton implements{
    JButton b;
    
    public buttonObject(String text){
        JButton b=new JButton(text); 
        b.setBounds(100,100,60,60);
        b.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {
                tf.setText("You Did It");//problem area
                b.setEnabled(false);
 

(в классе textfield)

     public void setText(String newtext) {
        text = newtext;
        super.setText(newtext);
    }
 

Комментарии:

1. Пожалуйста, приведите несколько примеров кода.

2. Да, извините, я забыл

3. Может быть, добавьте аргумент buttonObject и передайте текстовое поле, для которого вы хотите задать текст? Затем вызовите его следующим образом buttonObject b = new buttonObject("new button!", tf)

4. это выполняется, но кнопка и текстовое поле не имеют диалога и очень малы. Я начинаю думать, что это было бесплодное начинание с самого начала, и я должен держать его в одном классе, как нормальный человек?

5. Просто предложение по стандартному улучшению — имена классов и интерфейсов, а также конструкторы должны начинаться с заглавной буквы («class ButtonObject», «TextFieldObj»), а методы и переменные со строчными буквами («setText», «String text»)

Ответ №1:

textfieldobj

buttonObject

Зачем вы изобретаете все эти колеса? JTextField и JButton являются ли классы для представления текстового поля и кнопки, вам не нужно создавать вокруг них ничего не делающие обертки.

Кнопка должна влиять на содержимое текстового поля при нажатии

Это плохой дизайн; вы не хотите, чтобы ваша кнопка должна была знать о текстовом поле; если это так, нет никакого способа использовать указанную кнопку для чего-либо, кроме как изменить это точное текстовое поле.

итак, я использовал MouseEvent .

Да, это то, что нужно использовать. Но, просто .. добавьте слушателя в то место, которое знает как о кнопке, так и о поле. Это может быть main, но это подводит нас к другому вопросу:

public static void main(...

это не место для написания кода. Создайте объект, вызовите для него какой-нибудь метод ‘go’, и это единственная строка, которая должна быть у вашего main. Вы хотите уйти от static asap, вот как вы это делаете.

Итак, что-то вроде:

 public class MainApp {
    // frames, layout managers, whatever you need as well
    private final JButton switchTextButton;
    private final JTextField textField;

    public MainApp() {
        this.switchTextButton = new JButton("Switch it up!");
        this.textField = new JTextField();
        // add a panel, add these gui elements to it, etc.

        setupListeners();
    }

    private void setupListeners() {
        // hey, we have both the button and the textfield in scope here.
        switchTextButton.addActionListener(evt -> {
            textField.setText("Hello!");
        });
    }
}