如何提高大型JTable的滚动性能?

时间:2019-07-11 19:00:59

标签: java performance jtable jscrollpane

下面是滚动的基本示例,其中包含大量数据和1个Renderer。

具有7,000行和10列,当您使用鼠标快速向上/向下拖动滚动按钮时,可以看到较慢的性能。这是与渲染器简单地返回相同的字符串。

如果您在示例中编辑渲染器以取消注释IF(否则为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);

这是实际的代码。

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></pre></html>");    
//      else if (vColIndex == 1)
//          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></pre></html>");
//      else if (vColIndex == 2)
//          setText("<html><pre><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></pre></html>");
    setToolTipText((String) value);
    return this;
  }
}

还有其他内置选项可以尝试吗?

如何判断何时会出现预期的性能下降以及达到最高性能?

除了JVisualVM之外,是否还有其他工具可以帮助您确定运行速度的慢慢程度?

0 个答案:

没有答案