Как увеличить производительность прокрутки большого JTable? - PullRequest
0 голосов
/ 11 июля 2019

Ниже приведен простейший пример прокрутки с большими объемами данных и 1 средством визуализации.

При 7000 строках и 10 столбцах медленная производительность видна, когда вы используете мышь для перетаскивания кнопки прокрутки вверх / вверх.вниз быстро.Это с Renderer просто возвращает ту же строку.

Если вы отредактируете средство визуализации в примере, чтобы раскомментировать операторы IF (и еще, если), которые выполняют дополнительную работу с данными в первых 3 столбцах, вы заметите, что производительность значительно ухудшится при перемещении прокрутки.Кнопка вверх / вниз быстро.

//Remove these comments from the code.
//  if (vColIndex == 0)
//        setText("...
//  else if (vColIndex == 1)
//      setText("...
//  else if (vColIndex == 2)
//      setText("...

Для повышения производительности была использована следующая команда:

scrollpane.getViewport().setBackingStoreEnabled(true);

Поскольку вышеприведенное устарело, следующая команда использовалась со всеми 3 доступными опциями, но все еще былабез улучшения.

  scrollpane.getViewport().setScrollMode(2);

Вот фактический код.

<code>import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;



public class RendererTest
{
    static JTable table;
    TableColumn tcol;

  public static void main(String[] argv) throws Exception 
  {
      JFrame frame = new JFrame("Creating a Custom Cell Reanderer!");
      frame.setSize(800, 800);

      JPanel panel = new JPanel();
      int rows = 7000;
      int cols = 10;
      Object data[][] = new Object[rows][cols] ;
      for (int i = 0; i<rows; i++)
      {
          for (int j=0; j<cols; j++)
          {
              data[i][j] = "Hello World";
          }
      }
      String columns [] = {"Colum 1","Column 2","Column 3","Column 4","Column 5",
              "Column 6","Column 7","Column 8","Column 9","Column 10"};
      DefaultTableModel model = new DefaultTableModel(data,columns);
      table = new JTable(model);
      JScrollPane scrollpane = new JScrollPane(table);
//    scrollpane.getViewport().setBackingStoreEnabled(true);
//    scrollpane.getViewport().setScrollMode(2);
//    System.out.println(scrollpane.getViewport().getScrollMode());
      scrollpane.getViewport().setScrollMode(2);
      table.setDoubleBuffered(true);
      scrollpane.setPreferredSize(new Dimension(700, 1000));
      scrollpane.setViewportView(table);

      panel.add(scrollpane);
      frame.add(panel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);

    int vColIndex = 0;
    table.getColumnModel().getColumn(vColIndex).setCellRenderer(new MyTableCellRenderer());
    table.getColumnModel().getColumn(++vColIndex).setCellRenderer(new MyTableCellRenderer());
    table.getColumnModel().getColumn(++vColIndex).setCellRenderer(new MyTableCellRenderer());
    table.getColumnModel().getColumn(++vColIndex).setCellRenderer(new MyTableCellRenderer());
    table.getColumnModel().getColumn(++vColIndex).setCellRenderer(new MyTableCellRenderer());
    table.getColumnModel().getColumn(++vColIndex).setCellRenderer(new MyTableCellRenderer());
    table.getColumnModel().getColumn(++vColIndex).setCellRenderer(new MyTableCellRenderer());
    table.getColumnModel().getColumn(++vColIndex).setCellRenderer(new MyTableCellRenderer());
    table.getColumnModel().getColumn(++vColIndex).setCellRenderer(new MyTableCellRenderer());
    table.getColumnModel().getColumn(++vColIndex).setCellRenderer(new MyTableCellRenderer());
  }
}

class MyTableCellRenderer extends JLabel implements TableCellRenderer {
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int rowIndex, int vColIndex) {
    setText(value.toString());
//      if (vColIndex == 0)
//            setText("<html><pre><FONT FACE='Monospaced' fontsize=16 COLOR=ffff00><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffff00><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ff00ff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT>
"); // иначе if (vColIndex == 1) // setText ("
<FONT FACE='Monospaced' fontsize=16 COLOR=ffff00><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffff00><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ff00ff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=bebebe><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT>
"); // иначе if (vColIndex == 2) // setText ("
<FONT FACE='Monospaced' fontsize=16 COLOR=ffb500><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ff00ff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ff00ff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ff00ff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffb500><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ff00ff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=00ffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffb500><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffffff><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffb500><B>?</B></FONT><FONT FACE='Monospaced' fontsize=16 COLOR=ffb500><B>?</B></FONT>
"); setToolTipText ((String) value); вернуть это;}}

Есть ли какие-либо другие встроенные опции, которые можно попробовать?

Как определить, когда ожидается снижение производительности и достижение максимальной производительности?

Существуют ли другие инструменты, кроме JVisualVMчтобы помочь определить медлительность?

...