Как вызвать другой класс в мой класс главного меню с помощью JMenuItem?

Я не знаю, как вызвать другой класс (называемый Calc), который находится в том же пакете, что и мой основной класс (Lista), используя JMenuItem. Если мне нужно быть более конкретным, я не знаю, как вызвать мой класс Calc в мой класс Lista, используя JMenuItem, который находится в моем классе Lista.

Код ниже - это мой класс Lista, извините за английских парней.

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

    import javax.swing.event.MenuEvent;
    import javax.swing.event.MenuListener;

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

    public class Lista extends JFrame{
      public Lista(){
        super("Menu");

        // Menu Bar
        JMenuBar barra = new JMenuBar();
        setJMenuBar(barra);

        // Menu
        JMenu opcoes = new JMenu("Options");

        // Menu Item
        JMenuItem item = new JMenuItem("Item 1");

        // actionlistener
        item.addActionListener(
          new ActionListener(){
            public void actionPerformed(ActionEvent e){
              //I think that is in here where i must write the code
            }
          }
        );

        opcoes.add(item);

        // Adds
        barra.add(opcoes);

        setSize(300, 150);
        setVisible(true);    
      }

      public static void main(String args[]){
        Lista app = new Lista();
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
    }

Другой класс, Calc, это просто простой калькулятор, который я сделал с помощью этого кода: открытый класс Calc extends JFrame {

public Calc(){
    super("Calculadora");
    Container tela = getContentPane();
    setLayout(null);

    JLabel rotulo1 = new JLabel("1 numero: ");
    JLabel rotulo2 = new JLabel("2 numero: ");
    JLabel showup = new JLabel("");

    JTextField texto1 = new JTextField(5);
    JTextField texto2 = new JTextField(5);

    JButton somar = new JButton ("+");
    JButton subtrair = new JButton("-");
    JButton dividir = new JButton("/");
    JButton multiplicar = new JButton("x");
    JButton exibir = new JButton("=");

    rotulo1.setBounds(30,20,100,20); rotulo2.setBounds(30,60,100,20);
    texto1.setBounds(100,20,200,20); texto2.setBounds(100,60,200,20);
    showup.setBounds(125,100,200,20);
    somar.setBounds(230,100,45,45);//coluna, linha, largura, comprimento
    subtrair.setBounds(280,100,45,45);
    dividir.setBounds(230,155,45,45);
    multiplicar.setBounds(280,155,45,45);
    exibir.setBounds(255,205,45,45);


    setVisible(true);
    setLocationRelativeTo(null);

    tela.add(rotulo1); tela.add(rotulo2);
    tela.add(texto1); tela.add(texto2); tela.add(showup);
    tela.add(exibir); tela.add(somar); tela.add(subtrair); tela.add(dividir);tela.add(multiplicar);

    setSize(350,300);

    somar.addActionListener( new ActionListener(){
        public void actionPerformed(ActionEvent e){
            double numero1, numero2, soma;
            soma=0;
            numero1 = Double.parseDouble(texto1.getText());
            numero2 = Double.parseDouble(texto2.getText());
            soma = numero1+numero2;
            showup.setVisible(true);
            showup.setText(texto1.getText()+""+"+"+""+texto2.getText()+""+"="+soma);
            texto1.setText(null); texto2.setText(null); texto1.requestFocus(); //funcao limpar e focar
        }
    }
    );

    subtrair.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            double numero1, numero2, subtrair;
            subtrair=0;
            numero1 = Double.parseDouble(texto1.getText());
            numero2 = Double.parseDouble(texto2.getText());
            subtrair = numero1 - numero2;
            showup.setVisible(true);
            showup.setText(texto1.getText()+""+"-"+""+texto2.getText()+""+"="+subtrair);
            texto1.setText(null); texto2.setText(null); texto1.requestFocus();
        }
    });

    multiplicar.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            double numero1, numero2, multiplicar;
            multiplicar=0;
            numero1 = Double.parseDouble(texto1.getText());
            numero2 = Double.parseDouble(texto2.getText());
            multiplicar = numero1*numero2;
            showup.setVisible(true);
            showup.setText(texto1.getText()+""+"x"+""+texto2.getText()+""+"="+multiplicar);
            texto1.setText(null); texto2.setText(null); texto1.requestFocus();
        }
    });

    dividir.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            double numero1, numero2, dividir;
            dividir=0;
            numero1 = Double.parseDouble(texto1.getText());
            numero2 = Double.parseDouble(texto2.getText());
            dividir=numero1/numero2;
            showup.setVisible(true);
            showup.setText(texto1.getText()+""+"/"+""+texto2.getText()+""+"="+dividir);
            texto1.setText(null); texto2.setText(null); texto1.requestFocus();
        }
    });


}

public static void main (String [] args){
    Calc app = new Calc();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}}

Единственное, что я хочу сделать, это: когда я нажимаю JMenuItem в коде Lista, вызывается моя программа калькулятора (класс Calc). Я уже пытался сделать: "Calc calc = new Calc(); calc.Visible(true);" или "предмет = расчет;" но не удалось. Я начинающий программист, ребята, извините, я думаю, что это просто.


person Felipe Squire    schedule 05.06.2016    source источник
comment
Похоже, вы пытаетесь создать и отобразить второй JFrame с помощью этого кода, и если это так, вы не хотите этого делать. См.: Использование нескольких JFrames, хорошая/плохая практика?. Что касается вашей проблемы, одно простое решение - просто передать ссылку на визуализированный другой класс в этот.   -  person Hovercraft Full Of Eels    schedule 05.06.2016


Ответы (3)


Фелипе, это сработало для меня... Это основано на ответе Санджива Саха...

enter 

import java.awt.Container;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Calc extends JDialog {

private JLabel rotulo1;
private JLabel rotulo2;
private JLabel showup;
private JTextField texto1;
private JTextField texto2;
private JButton somar;
private JButton subtrair;
private JButton dividir;
private JButton multiplicar;
private JButton exibir;

public Calc(Frame owner) {
super(owner, "Calculadora");
Container tela = getContentPane();
setLayout(null);

rotulo1 = new JLabel("1 numero: ");
rotulo2 = new JLabel("2 numero: ");
showup = new JLabel("");

texto1 = new JTextField(5);
texto2 = new JTextField(5);

somar = new JButton("+");
subtrair = new JButton("-");
dividir = new JButton("/");
multiplicar = new JButton("x");
exibir = new JButton("=");

rotulo1.setBounds(30, 20, 100, 20);
rotulo2.setBounds(30, 60, 100, 20);
texto1.setBounds(100, 20, 200, 20);
texto2.setBounds(100, 60, 200, 20);
showup.setBounds(125, 100, 200, 20);
somar.setBounds(230, 100, 45, 45);// coluna, linha, largura, comprimento
subtrair.setBounds(280, 100, 45, 45);
dividir.setBounds(230, 155, 45, 45);
multiplicar.setBounds(280, 155, 45, 45);
exibir.setBounds(255, 205, 45, 45);

setVisible(true);
setLocationRelativeTo(null);

tela.add(rotulo1);
tela.add(rotulo2);
tela.add(texto1);
tela.add(texto2);
tela.add(showup);
tela.add(exibir);
tela.add(somar);
tela.add(subtrair);
tela.add(dividir);
tela.add(multiplicar);

setSize(350, 300);

somar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        double numero1, numero2, soma;
        soma = 0;
        numero1 = Double.parseDouble(texto1.getText());
        numero2 = Double.parseDouble(texto2.getText());
        soma = numero1 + numero2;
        showup.setVisible(true);
        showup.setText(texto1.getText() + "" + "+" + "" + texto2.getText() + "" + "=" + soma);
        texto1.setText(null);
        texto2.setText(null);
        texto1.requestFocus(); // funcao limpar e focar
    }
});

subtrair.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        double numero1, numero2, subtrair;
        subtrair = 0;
        numero1 = Double.parseDouble(texto1.getText());
        numero2 = Double.parseDouble(texto2.getText());
        subtrair = numero1 - numero2;
        showup.setVisible(true);
        showup.setText(texto1.getText() + "" + "-" + "" + texto2.getText() + "" + "=" + subtrair);
        texto1.setText(null);
        texto2.setText(null);
        texto1.requestFocus();
    }
});

multiplicar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        double numero1, numero2, multiplicar;
        multiplicar = 0;
        numero1 = Double.parseDouble(texto1.getText());
        numero2 = Double.parseDouble(texto2.getText());
        multiplicar = numero1 * numero2;
        showup.setVisible(true);
        showup.setText(texto1.getText() + "" + "x" + "" + texto2.getText() + "" + "=" + multiplicar);
        texto1.setText(null);
        texto2.setText(null);
        texto1.requestFocus();
    }
});

dividir.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        double numero1, numero2, dividir;
        dividir = 0;
        numero1 = Double.parseDouble(texto1.getText());
        numero2 = Double.parseDouble(texto2.getText());
        dividir = numero1 / numero2;
        showup.setVisible(true);
        showup.setText(texto1.getText() + "" + "/" + "" + texto2.getText() + "" + "=" + dividir);
        texto1.setText(null);
        texto2.setText(null);
        texto1.requestFocus();
    }
});

  }

}

и Листа класс...

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

import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;

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

public class Lista extends JFrame{
  public Lista(){
    super("Menu");

    // Menu Bar
    JMenuBar barra = new JMenuBar();
    setJMenuBar(barra);

    // Menu
    JMenu opcoes = new JMenu("Options");

    // Menu Item
    JMenuItem item = new JMenuItem("Item 1");

    // actionlistener
    item.addActionListener(
      new ActionListener(){
        public void actionPerformed(ActionEvent e){
          new Calc(Lista.this);
        }
      }
    );

    opcoes.add(item);

    // Adds
    barra.add(opcoes);

    setSize(300, 150);
    setVisible(true);    
  }

  public static void main(String args[]){
    Lista app = new Lista();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}
person wagnermarques    schedule 13.06.2016
comment
спасибо, учитель! оно работает! Я пытался запустить этот код, когда мы были в вашем классе, и он отлично работает. - person Felipe Squire; 15.06.2016

Один простой способ вызвать методы из другого класса — получить ссылку на другой класс и вызвать метод. Если объект другого класса уже существует, то не делайте этого, создавая новый объект, а передайте ссылку из существующего объекта в этот класс. То, как это будет сделано конкретно, будет зависеть от кода, который вы еще не показали нам.

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

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

Похоже, вы пытаетесь создать и отобразить второй JFrame с помощью этого кода, и если это так, вы не хотите этого делать. См.: Использование нескольких JFrames, хорошая/плохая практика?.

На самом деле, вам, вероятно, лучше сделать так, чтобы Lista не расширял JFrame, а вместо этого создавал и создавал JMenu, который затем можно было разместить там, где и когда вам это нужно, но опять же, чтобы полностью ответить на ваш вопрос, потребуются знания, полученные из < em>код, который вы нам еще не показывали.

person Hovercraft Full Of Eels    schedule 05.06.2016
comment
Я уже поставил другой код в этом вопросе. Извините, я не думал, что это вообще важно. Я новичок, и я просто хочу вызвать калькулятор, который находится в другом классе, когда я нажимаю на вызываемый элемент JMenuItem. - person Felipe Squire; 05.06.2016
comment
@FelipeSquire: спасибо за этот пост, но извините, я хочу знать больше, в частности, как должны взаимодействовать оба класса. Будет ли Calc отображать окно Lista в ответ на ActionLIstener? Будут ли оба отображаться с самого начала? Или Lista отобразит объект Calc, возможно, в ответ на один из его слушателей? Ваш вопрос касается того, как заставить один класс изменить поведение другого, и то, как они должны взаимодействовать, является ключевой информацией; разве это не имеет смысла? - person Hovercraft Full Of Eels; 05.06.2016
comment
Да, извините, класс Lista похож на окно инструментов, и когда вы щелкаете в JMenuItem, я хочу открыть новое окно с содержимым класса Calc (калькулятор). Я также хочу реализовать в будущем код, чтобы содержимое класса Calc превосходило содержимое Lista, но чтобы меню оставалось там, точно так же, как веб-браузер, который при нажатии на новую панель открывает новый контент в основном контейнере ( тела в данном случае). - person Felipe Squire; 05.06.2016

Не могли бы вы внести следующие изменения в свои классы и увидеть результат:

1) Список.java

 public static void main(String args[]){
    Lista app = new Lista();        
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    app.setLocationRelativeTo(null); //so that the JFrame appears at the center of screen
  }

2) Список.java

// actionlistener
item.addActionListener(
      new ActionListener(){
        public void actionPerformed(ActionEvent e){
          //I think that is in here where i must write the code              
          Calc calc=new Calc(Lista.this); // pass owner JFrame i.e. an instance of Lista
          calc.setVisible(true);
        }
      }
 );

3) Кальк.java

import java.awt.Container;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Calc extends JDialog {

private JLabel rotulo1;
private JLabel rotulo2;
private JLabel showup;
private JTextField texto1;
private JTextField texto2;
private JButton somar;
private JButton subtrair;
private JButton dividir;
private JButton multiplicar;
private JButton exibir;

public Calc(Frame owner) {
    super(owner, "Calculadora");
    Container tela = getContentPane();
    setLayout(null);

    rotulo1 = new JLabel("1 numero: ");
    rotulo2 = new JLabel("2 numero: ");
    showup = new JLabel("");

    texto1 = new JTextField(5);
    texto2 = new JTextField(5);

    somar = new JButton("+");
    subtrair = new JButton("-");
    dividir = new JButton("/");
    multiplicar = new JButton("x");
    exibir = new JButton("=");

    rotulo1.setBounds(30, 20, 100, 20);
    rotulo2.setBounds(30, 60, 100, 20);
    texto1.setBounds(100, 20, 200, 20);
    texto2.setBounds(100, 60, 200, 20);
    showup.setBounds(125, 100, 200, 20);
    somar.setBounds(230, 100, 45, 45);// coluna, linha, largura, comprimento
    subtrair.setBounds(280, 100, 45, 45);
    dividir.setBounds(230, 155, 45, 45);
    multiplicar.setBounds(280, 155, 45, 45);
    exibir.setBounds(255, 205, 45, 45);

    setVisible(true);
    setLocationRelativeTo(null);

    tela.add(rotulo1);
    tela.add(rotulo2);
    tela.add(texto1);
    tela.add(texto2);
    tela.add(showup);
    tela.add(exibir);
    tela.add(somar);
    tela.add(subtrair);
    tela.add(dividir);
    tela.add(multiplicar);

    setSize(350, 300);

    somar.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double numero1, numero2, soma;
            soma = 0;
            numero1 = Double.parseDouble(texto1.getText());
            numero2 = Double.parseDouble(texto2.getText());
            soma = numero1 + numero2;
            showup.setVisible(true);
            showup.setText(texto1.getText() + "" + "+" + "" + texto2.getText() + "" + "=" + soma);
            texto1.setText(null);
            texto2.setText(null);
            texto1.requestFocus(); // funcao limpar e focar
        }
    });

    subtrair.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double numero1, numero2, subtrair;
            subtrair = 0;
            numero1 = Double.parseDouble(texto1.getText());
            numero2 = Double.parseDouble(texto2.getText());
            subtrair = numero1 - numero2;
            showup.setVisible(true);
            showup.setText(texto1.getText() + "" + "-" + "" + texto2.getText() + "" + "=" + subtrair);
            texto1.setText(null);
            texto2.setText(null);
            texto1.requestFocus();
        }
    });

    multiplicar.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double numero1, numero2, multiplicar;
            multiplicar = 0;
            numero1 = Double.parseDouble(texto1.getText());
            numero2 = Double.parseDouble(texto2.getText());
            multiplicar = numero1 * numero2;
            showup.setVisible(true);
            showup.setText(texto1.getText() + "" + "x" + "" + texto2.getText() + "" + "=" + multiplicar);
            texto1.setText(null);
            texto2.setText(null);
            texto1.requestFocus();
        }
    });

    dividir.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double numero1, numero2, dividir;
            dividir = 0;
            numero1 = Double.parseDouble(texto1.getText());
            numero2 = Double.parseDouble(texto2.getText());
            dividir = numero1 / numero2;
            showup.setVisible(true);
            showup.setText(texto1.getText() + "" + "/" + "" + texto2.getText() + "" + "=" + dividir);
            texto1.setText(null);
            texto2.setText(null);
            texto1.requestFocus();
        }
    });

  }

}

Объяснение:

В Calc.java есть много тривиальных изменений.

  1. Класс создан для расширения JDialog вместо JFrame
  2. Конструктор изменен так, что он принимает владельца JFrame (Lista) в качестве аргумента.
  3. Было много локальных переменных JTextField, JButton, JLabel и т. д. Все они являются переменными экземпляра.

Надеюсь, это поможет вам.

person Sanjeev Saha    schedule 05.06.2016
comment
Откуда мы знаем, что Листе нужно создать объект Calc, а не наоборот? - person Hovercraft Full Of Eels; 05.06.2016
comment
Если Calc является другим графическим интерфейсом и уже отображается, то создание нового экземпляра будет контрпродуктивным. - person Hovercraft Full Of Eels; 05.06.2016
comment
Класс Calc - это простой калькулятор, и я хочу открыть этот калькулятор в новом окне, когда я щелкнул элемент, вызываемый JMenuItem, но я не могу этого сделать. Спасибо! - person Felipe Squire; 06.06.2016
comment
Привет, @FelipeSquire. Сожалеем, что вы по-прежнему не можете позвонить своему Calc. Когда я увидел, что еще один получил голосование, я предположил, что вы нашли свой ответ, и перестал следить за этим постом. Пожалуйста, внесите изменения в соответствии с моим ответом и посмотрите, работает ли это для вас или нет. Сообщите мне результат. - person Sanjeev Saha; 06.06.2016
comment
@FelipeSquire Не могли бы вы принять этот ответ, чтобы читатели вашего вопроса знали, какой ответ является правильным. В противном случае они не имеют ни малейшего понятия. - person Sanjeev Saha; 15.06.2016