如何使用JMenuItem将另一个类调用到我的主菜单类



我不知道如何使用JMenuItem调用与我的主类(Lista)在同一个包中的另一个类(称为Calc)。如果我需要更具体一点,我不知道如何使用Lista类上的JMenuItem将我的类Calc调用到我的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扩展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);
}}

我唯一想做的是:当我点击Lista代码中的JMenuItem时,我的计算器程序(Calc类)就会被调用。我已经尝试过:"Calc Calc=new Calc();Calc.Visible(true);"或"item=Calc;",但失败了。我是一个初学者,抱歉,我认为这很简单。

从另一个类调用方法的一种简单方法是获得对另一个类别的引用并调用该方法。如果另一个类的对象已经存在,那么不要通过创建新对象来实现,而是将现有对象的引用传递到这个类中。具体如何完成将取决于您尚未向我们展示的代码。

请注意,您的代码只能从一个主方法运行,我敢打赌,它不会是您发布的代码中的主方法,而是来自另一个类中的另一个主要方法,但所有这些都将取决于您尚未向我们展示的代码。你可能在这里检测到了一个主题,你应该考虑改进你的问题,展示更相关的代码,包括你计划如何启动这个类,它会从另一个类启动吗,另一个类做什么和看起来像什么,你想从这个类调用另一个类别的什么方法。。。。

更好的处理方法,包括M-V-C,但在现阶段这可能只会让你感到困惑,但你最好知道,我在上面建议的当前解决方案虽然简单,但不是最干净的。

看起来您可能正在尝试用这段代码创建和显示第二个JFrame,如果是这样,您就不想这样做了。请参阅:多个JFrame的使用,良好/不良实践?。

事实上,您最好让Lista不扩展JFrame,而是让它创建并生成一个JMenu,然后您可以在需要它的地方和时间放置它,但要想完全回答您的问题,需要从您尚未向我们展示的代码中获得知识

Felipe,这对我很有效……它是基于Sanjeev Saha的答案。。。

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();
}
});
}
}

和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){
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);
}
}

您能否在类中进行以下更改并查看结果:

1) Lista.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) Lista.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) Calc.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. CCD_ 6、CCD_,CCD_ 8等都是实例变量

希望这对你有所帮助。

最新更新