在另一个类中调用函数

时间:2018-10-27 16:14:18

标签: java swing jframe jpanel

您好,我遇到了这个问题:

我在Luncher类中创建了一个按钮,当我单击它时,我想在另一个类(Main)中调用一个函数,但是没有结果。 但是,当我在运行模式下定义(Main)类时,会得到预期的结果。问题是什么 ?

为我工作: When i set Main.class in run mode

这不起作用:/: When i click in button to show Main.class

这是可运行类(Luncher)的代码:

public class Luncher extends javax.swing.JFrame {

public Luncher() {

    setSize(600,400);
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    JButton jButton1 = new javax.swing.JButton();
            jButton1.setText("CLIC ON ME !");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            Main example = new Main();
            example.doThis();
        }
    });

       GroupLayout layout = new GroupLayout(getContentPane()); 
       getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(147, 147, 147)
            .addComponent(jButton1)
            .addContainerGap(180, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(108, 108, 108)
            .addComponent(jButton1)
            .addContainerGap(169, Short.MAX_VALUE))
    );


}


public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Luncher().setVisible(true);

        }
    });
} } 

第二类是Main:

public class Main extends javax.swing.JFrame {

private static GUI gameGui = new GUI(); //GUI its a JFrame class 
private static CardLayout card = new CardLayout();
private static JPanel content = new JPanel();

    public Main(){
       doThis();

    }


public static void doThis (){
    content.setLayout(card);
    gameGui.setVisible(true); 
    gameGui.add(content);
    gameGui.repaint();
    gameGui.revalidate();
    card.show(content);
    }


public static void main (String [] args) {


}  }

1 个答案:

答案 0 :(得分:1)

您可以使用一些基本解决方案。

您可以...

Main的引用传递给Luncher。这样,您可以在需要时调用所需的Main的功能。

这不是最佳解决方案,因为它将LauncherMain耦合在一起,使得难以重用代码,并且可能将Main的功能暴露给{{1 }},Launcher应该可以访问。

您可以...

您可以使用委托或观察者模式...

定义Launcher需要委托人实施的interface(或合同),以执行其所需的功能。

Launcher

然后,您将public interface LauncherDelegate { //... } 实现此Main

interface

并将自身的引用传递给public class Main extends javax.swing.JFrame implements LauncherDelegate { //...

Launcher

通过这种方式,public class Luncher extends javax.swing.JFrame { private LauncherDelegate delegate; public Luncher(LauncherDelegate delegate) { this.delegate = delegate //... 只能调用合同中描述的功能,它使代码解耦,因为可以使用Launcher的任何实现,而LauncherDelegate则不在乎,因此该代码更具可重用性和可配置性。