下面是滚动的基本示例,其中包含大量数据和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之外,是否还有其他工具可以帮助您确定运行速度的慢慢程度?