Ниже приведен простейший пример прокрутки с большими объемами данных и 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чтобы помочь определить медлительность?