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 の 2 行目がコンパイルされず、「匿名クラスはインターフェイスを実装しています。引数を持つことはできません」というエラーが表示されます。

ヘルプと回避策は大歓迎です。ありがとう!

4

6 に答える 6

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); } }); }
于 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 内で必要な場合は、最終的に宣言する必要があります。

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 に答える