您好,我遇到了这个问题:
我在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) {
} }
答案 0 :(得分:1)
您可以使用一些基本解决方案。
将Main
的引用传递给Luncher
。这样,您可以在需要时调用所需的Main
的功能。
这不是最佳解决方案,因为它将Launcher
与Main
耦合在一起,使得难以重用代码,并且可能将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
则不在乎,因此该代码更具可重用性和可配置性。