Как использовать SwingWorker в этом примере

1

У меня есть класс для чтения файла и загрузки информации внутри JTable, поэтому, когда у вас что-то подобное, ваше приложение станет настолько медленным, и вам придется использовать SwingWorker. я попытался следовать одному из моих друзей [SwingWorker] [1] наставника и sun API, но это первый раз, когда SwingWorker даже впервые узнал об этом, поэтому я попытался скопировать наставника, но, конечно, проблема код отправлен

мой путь был, изменив исходный код. (первый блок кода) К другому

    private DefaultTableModel createModel(String srtPath) {
        //int maxLine = ReadFile.maxLine(srtPath);  // debug
        //Object[][] data = new Object[maxLine][];
        //System.out.println(maxLine);  // debug
        DefaultTableModel model = new DefaultTableModel(columnNames, 0);
        ArrayList<String> ends = ReadFile.getFileEndingTime(srtPath);
        ArrayList<String> starts = ReadFile.getFileStartingTime(srtPath);
        ArrayList<String> subs = ReadFile.readSubtitles(srtPath);
        ArrayList<String> lins = ReadFile.ArraylineLengths(srtPath);
        for (int i = 0; i < ReadFile.maxLine(srtPath); i++) {
            //System.out.println(lins.get(i)+" "+starts.get(i)+" "+ ends.get(i)+" "+ subs.get(i));
            model.addRow(new Object[] {lins.get(i), starts.get(i), ends.get(i), subs.get(i)});
        }
        return model;

код после изменения Отредактировано [2]

 class Worker extends SwingWorker<DefaultTableModel, Void> {
       private final String srtPath;
       private final JTable table;
       DefaultTableModel model;
        public Worker(String srtPath, JTable table) {
                this.srtPath = srtPath;
                 this.table = table;
             }

      protected DefaultTableModel doInBackground(String srtPath)  {
     model = new DefaultTableModel(columnNames, 0);
    ArrayList<String> ends = ReadFile.getFileEndingTime(srtPath);
    ArrayList<String> starts = ReadFile.getFileStartingTime(srtPath);
    ArrayList<String> subs = ReadFile.readSubtitles(srtPath);
    ArrayList<String> lins = ReadFile.ArraylineLengths(srtPath);
    for (int i = 0; i < ReadFile.maxLine(srtPath); i++) {
        model.addRow(new Object[] {lins.get(i), starts.get(i), ends.get(i), subs.get(i)});
    }
    return model;
}
    @Override
protected void done() {
    table.setModel(model);
    table.setFillsViewportHeight(true);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    TableColumn columnA = table.getColumn("#");
    columnA.setMinWidth(10);
    columnA.setMaxWidth(40);
    TableColumn columnB= table.getColumn("Start");
    columnB.setMinWidth(80);
    columnB.setMaxWidth(90);
    TableColumn columnC= table.getColumn("End");
    columnC.setMinWidth(80);
    columnC.setMaxWidth(90);
}
}

код действия Отредактировано [2]

     Action openAction = new AbstractAction("Open Subtitle", openIcon) {
        @Override
        public void actionPerformed(ActionEvent e) {
            ourFileSelector.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            ourFileSelector.showSaveDialog(null);
            ourSrtFile =  ourFileSelector.getSelectedFile();
            srtPath = ourSrtFile.getAbsolutePath();
            Worker p = new Worker(srtPath, table);
            p.extecute();
            /*
            table.setModel(model);
            table.setFillsViewportHeight(true);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
            TableColumn columnA = table.getColumn("#");
            columnA.setMinWidth(10);
            columnA.setMaxWidth(40);
            TableColumn columnB= table.getColumn("Start");
            columnB.setMinWidth(80);
            columnB.setMaxWidth(90);
            TableColumn columnC= table.getColumn("End");
            columnC.setMinWidth(80);
            columnC.setMaxWidth(90);
                    */
        }
    };

после изменения кода я получаю эту ошибку, и она говорит, что реализует все абстрактные методы. Отредактировано [2]

C:\Users\isslam\Documents\NetBeansProjects\AnimeAid\src\animeaid\GuiInterface.java:129: error: cannot find symbol
                p.extecute();
  symbol:   method extecute()
  location: variable p of type GuiInterface.Worker
C:\Users\isslam\Documents\NetBeansProjects\AnimeAid\src\animeaid\GuiInterface.java:240: error: GuiInterface.Worker is not abstract and does not override abstract method doInBackground() in SwingWorker
     class Worker extends SwingWorker<DefaultTableModel, Void> {
Note: C:\Users\isslam\Documents\NetBeansProjects\AnimeAid\src\animeaid\GuiInterface.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors
C:\Users\isslam\Documents\NetBeansProjects\AnimeAid\nbproject\build-impl.xml:920: The following error occurred while executing this line:
C:\Users\isslam\Documents\NetBeansProjects\AnimeAid\nbproject\build-impl.xml:260: Compile failed; see the compiler error output for details.

полный класс

   public class GuiInterface extends JFrame {
    String[] columnNames = {"#", "Start", "End", "Translation column"};

    JComboBox laList;  
    ReadFile reader;
    private final int numberOfButton = 6;
    private final JTable table;
    JToolBar toolBar;
    private final JTextField enterText,startTime,endTime;
    private final JMenu jMenu1,jMenu2,jMenu3;
    private final JMenuBar jMenuBar1;
    private final JMenuItem itemNewSrt,itemOpenVideo,itemSavefile;
    private static JFileChooser ourFileSelector,ourVideoSelector;
    File ourVideoFile,ourSrtFile;
    Border Campound,empty,Boveld,etch;
    private final JLabel startTimeingLable,endTimeingLabel;
    public static String  mediaPath="",srtPath="";
    Canvas c;
    ImageIcon[] icon;
    JButton[] Obutton;
   static final int COLUMN = 4 ; 



         public static void main(String[] args) throws IOException 
       {
           //ReadFile.readSubtitles();
        NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files\\VideoLAN\\VLC");
        Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
          SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GuiInterface("");

            }

        });

}



    public GuiInterface(String title){

    //reader = new ReadFile();

    setSize(1024, 720);
    setVisible(true);
    setTitle("AnimeFactor");
    setDefaultCloseOperation(GuiInterface.EXIT_ON_CLOSE);
    //video setting 
    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
    c = new Canvas();
    String[] petStrings = { "Translation Line", "Both Line" };
    laList = new JComboBox(petStrings);
    c.setBackground(Color.black);
    JPanel p = new JPanel();
    p.setLayout(new BorderLayout());
    p.add(c, BorderLayout.CENTER);
    add(p, BorderLayout.CENTER);
    EmbeddedMediaPlayer mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer();
    mediaPlayer.setVideoSurface(mediaPlayerFactory.newVideoSurface(c));
    mediaPlayer.playMedia("C:\\Users\\isslam\\Downloads\\gg.mp4");
    table = new JTable(new DefaultTableModel(columnNames, 0));
    table.setFillsViewportHeight(true);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    TableColumn columnA = table.getColumn("#");
    columnA.setMinWidth(10);
    columnA.setMaxWidth(40);
    TableColumn columnB= table.getColumn("Start");
    columnB.setMinWidth(80);
    columnB.setMaxWidth(90);
    TableColumn columnC= table.getColumn("End");
        columnC.setMinWidth(80);
        columnC.setMaxWidth(90);


    ImageIcon openIcon = new ImageIcon(
                GuiInterface.class.getResource("/resources/image/folder-icon.png"));
        ImageIcon saveIcon = new ImageIcon(
                GuiInterface.class.getResource("/resources/image/red-disk-icon.png"));
        ImageIcon newIcon = new ImageIcon(
                GuiInterface.class.getResource("/resources/image/Actionsnew-icon.png"));




        Action openAction = new AbstractAction("Open Subtitle", openIcon) {
            @Override
            public void actionPerformed(ActionEvent e) {
                ourFileSelector.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                ourFileSelector.showSaveDialog(null);
                ourSrtFile =  ourFileSelector.getSelectedFile();
                srtPath = ourSrtFile.getAbsolutePath();
                Worker p = new Worker(srtPath, table);
                p.extecute();
                DefaultTableModel model = p.get();
                table.setModel(model);
                table.setFillsViewportHeight(true);
                table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
                TableColumn columnA = table.getColumn("#");
                columnA.setMinWidth(10);
                columnA.setMaxWidth(40);
                TableColumn columnB= table.getColumn("Start");
                columnB.setMinWidth(80);
                columnB.setMaxWidth(90);
                TableColumn columnC= table.getColumn("End");
                columnC.setMinWidth(80);
                columnC.setMaxWidth(90);
            }
        };

        Action saveAction = new AbstractAction("Save", saveIcon) {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        };
        Action newAction = new AbstractAction("New", newIcon) {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("New File");
            }
        };
    jMenu1 = new JMenu("File");
    jMenu2 = new JMenu("Video");
    jMenu3 = new JMenu("Subtitle");
    itemNewSrt = new JMenuItem(newAction);
    jMenu1.add(itemNewSrt);
    itemSavefile = new JMenuItem(saveAction);
    jMenu1.add(itemSavefile);
    jMenuBar1 = new JMenuBar();
    jMenuBar1.setBorder(etch);
    setJMenuBar(jMenuBar1);
    jMenuBar1.add(jMenu1);
    jMenuBar1.add(jMenu2);
    jMenuBar1.add(jMenu3);


    Obutton = new JButton[numberOfButton];
    etch = BorderFactory.createEtchedBorder();
    enterText = new JTextField();
    enterText.setPreferredSize(new Dimension(0,100));
    ourFileSelector = new JFileChooser();
    startTime = new JTextField();
    startTime.setPreferredSize(new Dimension(120, 20));
    startTimeingLable = new JLabel("Starting Time");
    endTimeingLabel = new JLabel("Ending Time");
    endTime = new JTextField();
    endTime.setPreferredSize(new Dimension(120, 20));
    toolBar = new JToolBar();
        //toolBar.add(Box.createHorizontalGlue());
        toolBar.setBorder(new LineBorder(Color.LIGHT_GRAY, 1));
        toolBar.add(newAction);
        toolBar.add(saveAction);


        JPanel toolBarPane = new JPanel(new BorderLayout());
        toolBarPane.add(toolBar,BorderLayout.NORTH);

        JPanel timing = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        timing.add(startTimeingLable);
        timing.add(startTime);
        timing.add(endTimeingLabel);
        timing.add(endTime);
        timing.add(laList);

        empty = BorderFactory.createEmptyBorder(30, 5, 5, 5);
        Boveld = BorderFactory.createBevelBorder(BevelBorder.RAISED);
        Campound = BorderFactory.createCompoundBorder(empty,Boveld);


        JPanel textFiled = new JPanel(new BorderLayout());
        textFiled.add(timing);
        textFiled.add(enterText,BorderLayout.SOUTH);
        textFiled.setBorder(Campound);
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.SOUTH);
        add(textFiled, BorderLayout.EAST);
        add(toolBarPane,BorderLayout.PAGE_START);




        //Container cp = getContentPane();
       toolBar.add(openAction);
       itemOpenVideo = new JMenuItem(openAction);
       jMenu1.add(itemOpenVideo);
       //itemOpenVideo.addActionListener(new MenuBarMethod());

    }

    private DefaultTableModel createModel(String srtPath) {
        DefaultTableModel model = new DefaultTableModel(columnNames, 0);
        ArrayList<String> ends = ReadFile.getFileEndingTime(srtPath);
        ArrayList<String> starts = ReadFile.getFileStartingTime(srtPath);
        ArrayList<String> subs = ReadFile.readSubtitles(srtPath);
        ArrayList<String> lins = ReadFile.ArraylineLengths(srtPath);
        for (int i = 0; i < ReadFile.maxLine(srtPath); i++) {

            model.addRow(new Object[] {lins.get(i), starts.get(i), ends.get(i), subs.get(i)});
        }
        return model;
    }

    class Worker extends SwingWorker<DefaultTableModel, Void> {
       private final String srtPath;
       private final JTable table;
        public Worker(String srtPath, JTable table) {
                this.srtPath = srtPath;
                 this.table = table;
             }

      protected DefaultTableModel doInBackground(String srtPath) throws InterruptedException {
    DefaultTableModel model = new DefaultTableModel(columnNames, 0);
    ArrayList<String> ends = ReadFile.getFileEndingTime(srtPath);
    ArrayList<String> starts = ReadFile.getFileStartingTime(srtPath);
    ArrayList<String> subs = ReadFile.readSubtitles(srtPath);
    ArrayList<String> lins = ReadFile.ArraylineLengths(srtPath);
    for (int i = 0; i < ReadFile.maxLine(srtPath); i++) {
        model.addRow(new Object[] {lins.get(i), starts.get(i), ends.get(i), subs.get(i)});
    }
    return model;
}
    @Override
protected void done() {
    table.setModel(model);
    table.setFillsViewportHeight(true);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    TableColumn columnA = table.getColumn("#");
    columnA.setMinWidth(10);
    columnA.setMaxWidth(40);
    TableColumn columnB= table.getColumn("Start");
    columnB.setMinWidth(80);
    columnB.setMaxWidth(90);
    TableColumn columnC= table.getColumn("End");
    columnC.setMinWidth(80);
    columnC.setMaxWidth(90);
}
}


public class MenuBarMethod implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent a){
        Object buttonPressed=a.getSource();
       if(buttonPressed.equals(itemOpenVideo)){
        ourVideoSelector.setFileSelectionMode(JFileChooser.FILES_ONLY);
        ourVideoSelector.showSaveDialog(null);
        ourVideoFile = ourVideoSelector.getSelectedFile();
        mediaPath = ourVideoFile.getAbsolutePath();
       }
    }

}

}   

У меня проблема в этих строках

protected void done() {
table.setModel(model);//because model are local  

также эта часть

 p.extecute();
 DefaultTableModel model = p.get()

здесь говорится, что класс абстрактно

 class Worker extends SwingWorker<DefaultTableModel, Void>

также вы снова объявили jtable, но в подрядчике класса gui объявлено

  • 0
    @peeskillet вы можете взглянуть на эту проблему, я думаю, вы поймете эту проблему
  • 0
    @peeskillet Можете ли вы сказать что-нибудь об этом?
Теги:
jtable
swingworker

1 ответ

0
Лучший ответ

Немедленное исправление

Из документации SwingWorker

Параметры типа:

T - результат, возвращаемый этим SwingWorker doInBackground и метод get
V - тип, используемый для выполнения промежуточных результатов с помощью этих методов публикации и обработки SwingWorker

Поэтому замените

class Process extends SwingWorker<String, String>

с

class Process extends SwingWorker<DefaultTableModel, Void>

Заметка:

  • Лучше, если вы переименуете свой класс из Process, в java уже есть класс с именем [Process][2].
  • Вы должны передать String через конструктор SwingWorker. (В этом случае используйте его как член класса Process и передайте его в конструкторе.

Вызов SwingWorker

В методе actionPerformed замените

DefaultTableModel model = createModel(srtPath);

с

Process p = new Process(srtPath);
p.extecute();
DefaultTableModel model = p.get();
// Rest of actionPerformed content.

Выполнение этого в фоновом режиме

Теперь все работает, но вы не достигли желаемого эффекта. Нить ui все еще ждет выхода.

  • Сделать метод execute последним, что нужно сделать в actionPerformed. (Поток Ui будет выпущен.)
  • Все остальное после получения возвращенного DefaultModel следует поместить в перегруженном done методе SwingWorker (Process). (Вам нужно передать необходимые объекты из конструктора).

    @Override
    protected void done() {
        table.setModel(model);
        table.setFillsViewportHeight(true);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        TableColumn columnA = table.getColumn("#");
        columnA.setMinWidth(10);
        columnA.setMaxWidth(40);
        TableColumn columnB= table.getColumn("Start");
        columnB.setMinWidth(80);
        columnB.setMaxWidth(90);
        TableColumn columnC= table.getColumn("End");
        columnC.setMinWidth(80);
        columnC.setMaxWidth(90);
    }
    

    Вы должны передать объект table из constrictor Process.

Поэтому в actionPerformed,

    Process p = new Process(srtPath, table);
    p.execute();

Надеюсь это поможет.


Редактировать:
Конструктор будет похож на следующий.

класс Worker расширяет SwingWorker {

   private String srtPath;
   private JTable table;

   public Worker(String srtPath, JTable table) {
       this.srtPath = srtPath;
       this.table = table;
   }

   // Other methods.
}
  • 0
    оба дают ошибку, говорят, создают подкласс рядом с переопределением, а другие одинаковы
  • 0
    также говорится, что класс Worker расширяет SwingWorker <DefaultTableModel, Void> {закрытый финальный String srtPath // srtPath не используются
Показать ещё 13 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню