匿名类实现接口,不能有参数

时间:2012-04-05 17:51:32

标签: java

我有一些代码,我试图重新编译和理解,但我有一个不编译的方法,我希望找到好的工作。方法如下。

private void launchEventPanel(String title) { 
    EventQueue.invokeLater(new Runnable(title) { 
        public void run() { 
        JFrame myFrame = new JFrame(); 
        myFrame.setTitle("Conference Call"); 
        myFrame.setIconImage(CallConference.this.myCore.myPanel.myIconManager.getPromptIcon(CallEMart.class.toString())); 
        myFrame.getContentPane().add(CallConference.this.myEventPanel, "Center"); 
        myFrame.pack(); 
        myFrame.setVisible(true); } }); }

EventQueue.invokeLater的第二行没有编译,我得到错误“匿名类实现接口,不能有参数”。

任何帮助和解决方法都非常感谢。谢谢!

6 个答案:

答案 0 :(得分:8)

那是因为Runnable只是一个接口而且它不会将任何参数作为匿名类。要绕过它,您可以将final分配给上面的参数:

private void launchEventPanel(final String title) { 
    EventQueue.invokeLater(new Runnable() { 
        public void run() { 
        JFrame myFrame = new JFrame(); 
        myFrame.setTitle("Conference Call");  
        myFrame.setIconImage(CallConference.this.myCore.myPanel.myIconManager.getPromptIcon(CallEMart.class.toString())); 
        myFrame.getContentPane().add(CallConference.this.myEventPanel, "Center"); 
        myFrame.pack(); 
        myFrame.setVisible(true); } }); }

答案 1 :(得分:2)

嗯,这就是它所说的,你不能给Runnable“构造函数”提供参数,因为没有构造函数 - 它是一个接口。

相反,声明title final,并直接在内部类中使用它。

答案 2 :(得分:1)

private void launchEventPanel(final String title) { 
    EventQueue.invokeLater(new Runnable() { 
        public void run() { 
        JFrame myFrame = new JFrame(); 
        myFrame.setTitle("Conference Call"); 
        myFrame.setIconImage(CallConference.this.myCore.myPanel.myIconManager.getPromptIcon(CallEMart.class.toString())); 
        myFrame.getContentPane().add(CallConference.this.myEventPanel, "Center"); 
        myFrame.pack(); 
        myFrame.setVisible(true); } }); }

你已经完成了。虽然据我所知,您实际上并未在代码中的任何位置使用title的值。

答案 3 :(得分:1)

您可以将匿名类转换为嵌套类。它允许您将参数传递给构造函数。

private static final MyRunnable implements Runnable {

    private final String title;

    public MyRunnable(String title) {
        this.title = title;
    }

    @Override
    public void run() {
        // use title here
    }

}    

答案 4 :(得分:0)

Runnable是一个接口,因此它不包含接受字符串的构造函数,您在此行中执行此操作:EventQueue.invokeLater(new Runnable(title) {

如果您想在title中使用public void run(),只需将标题作为最终参数,您就可以在该方法中使用它。

答案 5 :(得分:0)

好吧,正如消息所说:java.lang.Runnable是一个接口,所以你不能将title传递给它的构造函数。 使用:

EventQueue.invokeLater(new Runnable() { 

代替。

请注意,标题不会在任何地方使用。如果你在Runnable中需要它,你需要声明它最终:

private void launchEventPanel(final String title) { 
EventQueue.invokeLater(new Runnable() { 
    public void run() { 
    JFrame myFrame = new JFrame(); 
    myFrame.setTitle(title);