Nano Hash - криптовалюты, майнинг, программирование

Как обновить панель jprogress внутри jtable

Я разрабатываю приложение с jtable, и пользователь может начать загрузку. я хочу добавить в таблицу имя загрузки, состояние и индикатор выполнения. Я делаю так:

INIT JTABLE: (КОД, СОЗДАННЫЙ АВТОМАТИЧЕСКИ NETBEANS (есть ли способ его отредактировать? oO))

jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null},
                {null, null, null},
                {null, null, null},
                {null, null, null}
            },
            new String [] {
                "Categoria", "Sottocategoria", "Progresso (%)"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.Object.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.setColumnSelectionAllowed(true);
        jScrollPane2.setViewportView(jTable1);
        jTable1.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

СОЗДАТЬ РЕНДЕРЕР:

class ProgRenderer implements TableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            return (JProgressBar) value;
        }
    }

ДОБАВЬТЕ ЭТО В ПОСЛЕДНИЙ КОЛОНН:

jTable1.getColumn("Progresso (%)").setCellRenderer(new ProgRenderer());

Теперь я создал ArrayList<Thread> для сохранения активных потоков и ArrayList<JProgressBar> для сохранения всего индикатора выполнения, существующего в jtable (правильно?).

Теперь, чтобы добавить новую строку, я делаю так:

DefaultTableModel d = (DefaultTableModel) jTable1.getModel();
work++; // to have a number of active threads.
progress.add(getProgress(x, total));
d.addRow(new Object[]{Html.categoria, "Inizio scansione", progress.get(work)});
                Thread t = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        int max = Html.totale;
                        for(int i=1;i<=max;i++){
                            try {
                                progress.get(work).setValue(i); // JUST FOR TRY
                                System.out.println(progress.get(work).getValue()); // TRY
                                Thread.sleep(1000);
                            } catch (InterruptedException ex) {
                        }
                    }
                });
                working.add(t);
                t.start();


private JProgressBar getProgress(int x, int total) {
        JProgressBar progressCsv = new JProgressBar();
        progressCsv.setMaximum(total);
        progressCsv.setStringPainted(true);
        progressCsv.setString("0%");
        return progressCsv;
    }

Моя проблема в том, что прогресс не обновляется, мой подход неверен? можете вы помочь мне? спасибо


  • возможный дубликат добавление нескольких JProgressBar в TableColumn JTable 06.03.2012
  • несколько вещей, которые вы делаете неправильно (используя компонент в качестве данных ячейки, обновляя что-то вне EDT, засыпая в EDT) - лучше всего прочитать и понять базовый учебник по Swing, f.i. главы о том, как использовать таблицы и параллелизм, из docs.oracle.com/javase/ tutorial/uiswing/index.html и напишите код вручную, прежде чем прыгать в глубины генератора кода :-) 06.03.2012

Ответы:


1

Я рекомендую вам:

  1. В таблице хранить информацию только о прогрессе.

    Class[] types = new Class [] {
        java.lang.String.class, java.lang.String.class, java.lang.Integer.class
    };
    
  2. Реализовать индикатор выполнения для расширения JProgressBar

    class ProgRenderer extends JProgressBar implements 
    
    TableCellRenderer {
       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
          this.setValue((Integer)value)
          return this;
       }
    }
    
  3. Увеличение значений

    @Override
    public void run() {
        int max = Html.totale;
        for(int i=1;i<=max;i++){
            try {
                SwingUtiliites.invokeLater(new Runnable(){
                   public void run(){
                       jTable1.setValueAt(Integer.valueOf(i),row,2);
                   }
                }
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
        }
    }
    
20.06.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..