我有一些代码,我试图重新编译和理解,但我有一个不编译的方法,我希望找到好的工作。方法如下。
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的第二行没有编译,我得到错误“匿名类实现接口,不能有参数”。
任何帮助和解决方法都非常感谢。谢谢!
答案 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);