SwingWorker не работает при создании файла JAR

У меня есть следующий код:

import javax.swing.*;
import java.awt.event.*;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class KaraokeMachine extends JFrame implements ActionListener
{
ClassLoader Idr = this.getClass().getClassLoader();
java.applet.AudioClip everythingIsAwesome = JApplet.newAudioClip( Idr.getResource( "everything is awesome.wav" ) );
JLabel lbl1 = new JLabel( "" );
JButton btn = new JButton( "Play" );
JPanel pnl = new JPanel();
final Executor executor = Executors.newCachedThreadPool();

public KaraokeMachine()
{
    super( "Karaoke" );
    setSize( 520, 280 );
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    pnl.add( lbl1 );
    pnl.add( btn );
    btn.addActionListener( this );
    add( pnl ); setVisible( true );
}

public void actionPerformed( ActionEvent event )
{
    if ( event.getSource() == btn )
    {
            SwingWorker<Void, String> worker = new SwingWorker<Void, String>()
            {
                @Override
                protected Void doInBackground() throws Exception
                {
                    everythingIsAwesome.play();
                    this.publish("Everything");
                    Thread.sleep( 600 );
                    this.publish("Everything is");
                    Thread.sleep( 400 );
                    this.publish("Everything is Awesome!");
                    Thread.sleep( 2000 );
                    this.publish("Everything");
                    Thread.sleep( 600 );
                    this.publish("Everything is");
                    Thread.sleep( 400 );
                    this.publish("Everything is cool");
                    Thread.sleep( 400 );
                    this.publish("Everything is cool when");
                    Thread.sleep( 400 );
                    this.publish("Everything is cool when you're");
                    Thread.sleep( 400 );
                    this.publish("Everything is cool when you're part");
                    Thread.sleep( 150 );
                    this.publish("Everything is cool when you're part of");
                    Thread.sleep( 150 );
                    this.publish("Everything is cool when you're part of a");
                    Thread.sleep( 150 );
                    this.publish("Everything is cool when you're part of a team");
                    Thread.sleep( 1000 );
                    this.publish("Everything");
                    Thread.sleep( 600 );
                    this.publish("Everything is");
                    Thread.sleep( 400 );
                    this.publish("Everything is Awesome!");
                    Thread.sleep( 1500 );
                    this.publish("When");
                    Thread.sleep( 300 );
                    this.publish("When you're");
                    Thread.sleep( 300 );
                    this.publish("When you're livin'");
                    Thread.sleep( 300 );
                    this.publish("When you're livin' in");
                    Thread.sleep( 300 );
                    this.publish("When you're livin' in a");
                    Thread.sleep( 300 );
                    this.publish("When you're livin' in a dream!");
                    Thread.sleep( 300 );
                    return null;
                }
            @Override
            protected void process( List<String> res )
            {
                for(String text : res)
                {
                    lbl1.setText(text); 
                }
                }
        };
        executor.execute(worker);
    }
}
public static void main( String[] args )
{
    KaraokeMachine karaoke = new KaraokeMachine();
}

}

Когда я превращаю это в файл класса, он работает нормально, но когда я превращаю его в файл jar, я получаю следующую ошибку:

Исключение в потоке "AWT-EventQueue-0" java.lang.NoClassDegFoundError: KaraokeMachine$1

Кто-нибудь знает, как изменить код, чтобы свингворк работал в jar-файле?

1 ответ

Решение

Это исключение означает, что в вашем пути к классам отсутствует некоторый аномальный внутренний класс. Таким образом, ответ наиболее вероятен: когда вы "связываете" ваши классы в этот файл классов, вы забыли, что классы могут быть названы A$1.class,

KaraokeMachine.class является "основным" классом, но здесь:

SwingWorker<Void, String> worker = new SwingWorker<Void, String>() {

Вы создаете анонимный внутренний класс, который входит в KaraokeMachine$1.class. Чтобы запустить ваше приложение, вам нужны все эти файлы классов.

Другими словами: содержимое вашего JAR-файла неполное. Внимательно посмотрите, как вы строите этот файл JAR. Смотрите здесь, например.

Другие вопросы по тегам