基本上我想要做的就是启动按钮来启动另一个类中运行,并作用于另一个对象的方法。

我给听者代码:

button1a.addActionListener(new ActionListener() {
    public void actionPerformed (ActionEvent event) {
        // Figure out how to make this work
        //sim.runCastleCrash(); 
    }
} );

我为其他类代码:

public static void main(String[] args) {
    CastleCrash sim;
    sim = new CastleCrash();
}

public void runCastleCrash() {
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

我得到的感觉,这也不能太硬,但我缺了一块。

有帮助吗?

解决方案

来引用一个匿名类东西的一种方式是使用final关键字:

  public static void main(String[] args) {
    final Object thingIWantToUse = "Hello";

    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println(thingIWantToUse);
      }
    });

    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

可替换地,可以访问一个封闭类型的成员(变量或方法):

public class ActionListenerDemo2 {
  private final JFrame frame = new JFrame();
  private Object thingIWantToUse = "Hello";

  public ActionListenerDemo2() {
    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        thingIWantToUse = "Goodbye";
        System.out.println(thingIWantToUse);
      }
    });
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    new ActionListenerDemo2().frame.setVisible(true);
  }
}

其他提示

我已经跟你同样的问题,这是我如何解决它。

您可以让你的最终目标(最终CastleCrash SIM =新CastleCrash();),但我并不想这样做,或者你可以像setter方法与您其他类运行的方法:

我给听者类代码:

button1a.addActionListener(new ActionListener()
{

    public void actionPerformed (ActionEvent event)
    {
    //How to make this work ?
    //Like this:
    runCC();
    }
});

public void runCC()
{
    CastleCrash sim = new CastleCrash();
    sim.runCastleCrash();
}

我为其他类代码:

public void runCastleCrash()
{   
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

希望这是有帮助的,祝你好运! :)

道尔已经与关于如何从事件监听器(或一般的匿名内部类)访问变量很好的例子几乎答案。然而有在Swing事件侦听器更一般的太阳资源即规范和所有的警告的一个很好的概述考虑到书写时它们。

不知怎的,你需要提供你的CastleCrash对象的引用从您的ActionListener调用。

您可能想继承的JFrame,或无论是包含您的JButton使得它具有两个你你的主要方法和然后可以从您的匿名内部类的ActionListener引用的CastleCrash属性。

但 - 小心,你看起来像您所呼叫会是怎样从GUI事件线程(其中操作监听器将调用)内的长时间运行的方法。这通常是一个坏主意,你会如果你的图形用户界面无响应。

请参阅 http://java.sun.com/产品/ JFC / TSC /用品/线程/ threads1.html 尤其是对SwingWorker类位,了解如何避免这个问题的想法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top