Как передать аргументы в SwingWorker?

Я пытаюсь реализовать Swing worker в своем графическом интерфейсе. На данный момент у меня есть JFrame, содержащий кнопку. Когда это нажато, он должен обновить отображаемую вкладку, а затем запустить программу в фоновом потоке. Вот что у меня есть до сих пор.

class ClassA
{
    private static void addRunButton() 
    {
        JButton runButton = new JButton("Run");
        runButton.setEnabled(false);
        runButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) 
            {
                new ClassB().execute();
            }
    });

    mainWindow.add(runButton);
    }
}

class ClassB extends SwingWorker<Void, Integer>
{
    protected Void doInBackground()
    {
        ClassC.runProgram(cfgFile);
    }

    protected void done()
    {
        try 
        { 
        tabs.setSelectedIndex(1);
        } 
        catch (Exception ignore) 
        {
        }
    }
}

Я не понимаю, как я могу передать свой объект cfgFile. Пожалуйста, может кто-нибудь посоветовать по этому поводу?


person Community    schedule 25.10.2011    source источник


Ответы (2)


Почему бы не дать ему поле «Файл» и не заполнить это поле с помощью конструктора, который принимает параметр «Файл»?

class ClassB extends SwingWorker<Void, Integer>
{
    private File cfgFile;

    public ClassB(File cfgFile) {
       this.cfgFile = cfgFile;
    }

    protected Void doInBackground()
    {
        ClassC.runProgram(cfgFile);
    }

    protected void done()
    {
        try 
        { 
        tabs.setSelectedIndex(1);
        } 
        catch (Exception ignore) 
        {
           // *** ignoring exceptions is usually not a good idea. ***
        }
    }
}

А затем запустите его так:

public void actionPerformed(ActionEvent e) 
{
    new ClassB(cfgFile).execute();
}
person Hovercraft Full Of Eels    schedule 25.10.2011
comment
+1 и исключение здесь из будущего и свингера, если threa">stackoverflow.com/questions/7053865/, - person mKorbel; 26.10.2011
comment
Поскольку File является входом в конструктор (а не в метод execute), разве вы не должны запускать его так? новый ClassB(cfgFile).execute(); - person james.garriss; 10.07.2012
comment
@james.garriss: действительно должен. Ошибка исправлена, и спасибо! - person Hovercraft Full Of Eels; 10.07.2012
comment
Мне может понадобиться общий класс SwingWorker! - person Houssem Badri; 22.04.2014

Используйте конструктор для передачи параметра. Например, вот так:

class ClassB extends SwingWorker<Void, Integer> 
{

private File cfgFile; 

public ClassB(File cfgFile){
this.cfgFile=cfgFile;
}

protected Void doInBackground() 
{ 
    ClassC.runProgram(cfgFile); 
} 

protected void done() 
{ 
    try  
    {  
    tabs.setSelectedIndex(1); 
    }  
    catch (Exception ignore)  
    { 
    } 
} 

}

person carawan    schedule 25.10.2011