как я могу вызвать объект из другого класса?

#java

Вопрос:

У меня есть четыре класса, основной класс, класс «MyFrame», класс «MyButton» и класс MySecondFrame. В методе класса MyButton я хочу установить видимость второго кадра, созданного в основном классе, на значение true, а видимость первого кадра-на значение false (также созданного в основном классе). Теперь у меня проблема в том, что я не могу вызвать кадры to, чтобы установить их видимость в значение true или false. Как я могу это решить? (это ошибка «не удается разрешить символ») Вот код:

 package com.company;

public class Main {

public static void main(String[] args) {
    MyFrame firstFrame = new MyFrame();
    MyButton firstButton = new MyButton();
    //MyTextField firstTextField = new MyTextField();
    MySecondFrame secondFrame = new MySecondFrame();
    MyLabel firstLabel = new MyLabel();
    firstFrame.add(firstButton);
    
    //secondFrame.add(firstTextField);
    //secondFrame.add(firstLabel);
}
}

package com.company;

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

public class MyFrame extends JFrame{

MyFrame(){
    this.getContentPane().setBackground(new Color(0xD3D3D3));
    this.setSize(500, 700);
    this.setLocation(870,15);
    this.setResizable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    this.setTitle("Converter");
    this.setLayout(null);
}
}

package com.company;

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

public class MyButton extends JButton implements ActionListener{


MyButton(){
    this.setBounds(150, 100, 200, 50);
    this.setText("Convert Currencies");
    this.setFocusable(false);
    this.setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
    if(e.getSource()==this){
        firstFrame.setVisible(false);
        secondFrame.setVisible(true);
    }
}
package com.company;

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

public class MySecondFrame extends JFrame {
MySecondFrame(){
    this.getContentPane().setBackground(new Color(0xD3D3D3));
    this.setSize(500, 700);
    this.setLocation(870,15);
    this.setResizable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    this.setTitle("Converter");
    this.setLayout(null);
}
 

}

Ответ №1:

Вы можете добиться того, чего хотите, передавая интерфейс из основного класса в класс MyButton.

Во-первых, вы определяете интерфейс

 interface ButtonListener{
     void onClick();
}
 

Во-вторых, измените конструктор MyButton

 public class MyButton extends JButton implements ActionListener{

private ButtonListener buttonListener;

MyButton(ButtonListener buttonListener){
    this.buttonListener = buttonListener;
    this.setBounds(150, 100, 200, 50);
    this.setText("Convert Currencies");
    this.setFocusable(false);
    this.setVisible(true);
}
    @Override
    public void actionPerformed(ActionEvent e) {
    if(e.getSource()==this){
         buttonListener.onClick();
    }
}
 

Наконец, передайте этот интерфейс своему классу MyButton

 public class Main implements ButtonListener {

    MyFrame firstFrame;
    MySecondFrame secondFrame;

    public Main(){
        firstFrame = new MyFrame();
        secondFrame = new MySecondFrame();

        MyButton firstButton = new MyButton(this);
        //MyTextField firstTextField = new MyTextField();
        MyLabel firstLabel = new MyLabel();
        firstFrame.add(firstButton);

        //secondFrame.add(firstTextField);
        //secondFrame.add(firstLabel);
    }

    public static void main(String[] args) {
        Main main = Main();
    }

    @Override
    public void onClick() {
        //here, your button event triggered
        //do what you want
        firstFrame.setVisible(false);
        secondFrame.setVisible(true);
    }

}
 

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

1. Спасибо за ответ, но он все равно не работает.

2. на «com.company.Main.this» нельзя ссылаться из статического контекста

3. «onClick()» в «com.company. Основные» столкновения с «onClick()» в «com.company. Список кнопок»; попытка назначить более слабые права доступа («пакет-частный»); был «публичным»

4. Что означают первые две ошибки и почему он все еще не может разрешить символы первого кадра и второго кадра?

5. Я обновил, поместил «public» в @Переопределить public void onClick() {