1

我有一些我正在尝试重新编译和理解的代码,但我有一个无法编译的方法,我希望找到好的解决方法。方法如下。

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 的第二行没有编译,我得到错误“匿名类实现接口,不能有参数”。

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

4

6 回答 6

8

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

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); } }); }
于 2012-04-05T17:55:13.620 回答
2

嗯,正如它所说,你不能给Runnable“构造函数”参数,因为没有构造函数——它是一个接口。

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

于 2012-04-05T17:55:19.777 回答
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在代码中使用任何地方的值。

于 2012-04-05T17:55:11.327 回答
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
    }

}    
于 2012-04-05T18:01:14.333 回答
0

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

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

于 2012-04-05T17:56:46.623 回答
0

好吧,正如消息所说:java.lang.Runnable 是一个接口,因此您不能将标题传递给它的构造函数。采用:

EventQueue.invokeLater(new Runnable() { 

反而。

请注意,标题不在任何地方使用。如果在 Runnable 中需要它,则需要将其声明为 final:

private void launchEventPanel(final String title) { 
EventQueue.invokeLater(new Runnable() { 
    public void run() { 
    JFrame myFrame = new JFrame(); 
    myFrame.setTitle(title); 
于 2012-04-05T17:59:11.577 回答