Moderator: JIDE Support
/*
* @(#)LargeSortableTableDemo.java
*
* Copyright 2002 - 2004 JIDE Software Inc. All rights reserved.
*/
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.Box.Filler;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import com.jidesoft.converter.ObjectConverterManager;
import com.jidesoft.grid.JideTable;
import com.jidesoft.grid.SortableTable;
import com.jidesoft.grid.SortableTableModel;
import com.jidesoft.grid.TableModelWrapperUtils;
import com.jidesoft.paging.PageNavigationBar;
import com.jidesoft.plaf.LookAndFeelFactory;
import com.jidesoft.status.StatusBar;
import com.jidesoft.swing.JideBoxLayout;
import com.jidesoft.swing.JidePopupMenu;
/**
* Demoed Component: {@link SortableTable} <br> Required jar files: jide-common.jar, jide-grids.jar <br> Required L&F:
* any L&F
*/
public class LargeSortableTableNavBarDemo extends AbstractDemo {
private static final long serialVersionUID = 8470522350348490198L;
public DefaultTableModel _model;
public SortableTable _sortableTable;
protected JLabel _countLabel;
protected JSlider _slider;
public LargeSortableTableNavBarDemo() {
}
public static class LargeTableModel extends DefaultTableModel {
private static final long serialVersionUID = -5456719708922578368L;
@Override
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return Integer.class;
case 1:
return Double.class;
case 2:
return Boolean.class;
case 3:
return String.class;
}
return Object.class;
}
}
public String getName() {
return "SortableTable Demo (Large Model)";
}
@Override
public Component getOptionsPanel() {
JPanel panel = new JPanel();
panel.setLayout(new JideBoxLayout(panel, JideBoxLayout.Y_AXIS, 2));
_slider = new JSlider(1, 6, 4);
_slider.setValue((int) Math.log10(_model.getRowCount()));
panel.add(new JLabel("Data set size (to the power of 10):"));
panel.add(_slider);
_countLabel = new JLabel();
_countLabel.setText("Total row counts: " + ObjectConverterManager.toString(_model.getRowCount()));
panel.add(_countLabel);
_slider.setMajorTickSpacing(1);
_slider.setPaintTrack(true);
_slider.setSnapToTicks(true);
_slider.setPaintTicks(true);
_slider.setPaintLabels(true);
_slider.setPaintTicks(true);
_slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
if (!_slider.getValueIsAdjusting()) {
clearData();
final int value = (int) Math.pow(10, _slider.getValue());
populateTable(value);
}
}
});
panel.add(Box.createVerticalStrut(6));
panel.add(new JButton(new AbstractAction("Insert a row") {
private static final long serialVersionUID = -4663467797343622067L;
public void actionPerformed(ActionEvent e) {
int row = _sortableTable.getSelectedRow();
if (row == -1) {
row = _sortableTable.getRowCount();
}
_model.insertRow(row, new Object[]{100000, Math.random(), Boolean.FALSE, "new row"});
int visualRow = _sortableTable.getSortedRowAt(row);
_sortableTable.changeSelection(visualRow, 0, false, false);
}
}));
panel.add(new JButton(new AbstractAction("Delete selected rows") {
private static final long serialVersionUID = 6583734909578856612L;
public void actionPerformed(ActionEvent e) {
// _sortableTable.getSelectedRows() returns the row indices after sorted,
// so we need to convert them to the actual row indices as in the actual table model
int[] rows = TableModelWrapperUtils.getActualRowsAt(_sortableTable.getModel(), _sortableTable.getSelectedRows(), true);
for (int i = rows.length - 1; i >= 0; i--) {
int row = rows[i];
_model.removeRow(row);
}
}
}));
panel.add(new JButton(new AbstractAction("Delete all rows") {
private static final long serialVersionUID = -8149334113803021585L;
public void actionPerformed(ActionEvent e) {
clearData();
}
}));
return panel;
}
private void clearData() {
int rowCount = _model.getRowCount();
_model.getDataVector().clear();
_model.fireTableRowsDeleted(0, rowCount - 1);
}
private void populateTable(int value) {
for (int i = 0; i < value; i++) {
_model.addRow(new Object[]{i * 1024, Math.random(), i % 2 == 0, "row" + i});
}
}
@Override
public String getDescription() {
return "This is a demo of SortableTable with a large table model. You can adjust the slider to get a table model as many as 1 million rows.\n" +
"\nClick once on the header to sort ascending, click twice to sort descending, a third time to unsort. Hold CTRL key then click on several headers to see multiple columns sorting. With a large table model, you can experience the performance when sorting.\n" +
"\nTo see the dynamic update when table model changes, press the buttons in options panel.\n" +
"\n" +
"Demoed classes:\n" +
"com.jidesoft.grid.SortableTable";
}
public String getProduct() {
return PRODUCT_NAME_GRIDS;
}
public Component getDemoPanel() {
_model = new LargeTableModel();
_model.addColumn("int");
_model.addColumn("double");
_model.addColumn("boolean");
_model.addColumn("string");
_sortableTable = new SortableTable(_model);
_sortableTable.setAutoResizeMode(JideTable.AUTO_RESIZE_FILL);
_sortableTable.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
if (e.isPopupTrigger()) {
showPopup(e);
}
}
@Override
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
if (e.isPopupTrigger()) {
showPopup(e);
}
}
private void showPopup(MouseEvent e) {
int column = ((JTableHeader) e.getSource()).getColumnModel().getColumnIndexAtX(e.getPoint().x);
JMenuItem[] menuItems = ((SortableTableModel) _sortableTable.getModel()).getPopupMenuItems(column);
JPopupMenu popupMenu = new JidePopupMenu();
for (JMenuItem item : menuItems) {
popupMenu.add(item);
}
popupMenu.show((Component) e.getSource(), e.getPoint().x, e.getPoint().y);
}
});
PageNavigationBar navBar = new PageNavigationBar(_sortableTable) {
// @Override
// protected MouseWheelListener createMouseWheelListener() {
// return new MouseWheelListener() {
//
// @Override
// public void mouseWheelMoved(MouseWheelEvent e) {
//
// }
//
// };
// }
private void customizeNavigationBar() {
add(Box.createHorizontalStrut(5));
add(new JLabel("Rows"));
add(new JFormattedTextField());
add(Box.createHorizontalStrut(5));
add(Box.createHorizontalStrut(5));
add(Box.createHorizontalStrut(5));
setRollover(true);
getPageNavigationSupport().setPageSize(100);
}
@Override
protected void initComponents() {
super.initComponents();
if (getComponent(getComponentCount() - 1) instanceof Filler) {
remove(getComponentCount() - 1);
}
customizeNavigationBar();
add(Box.createGlue(), JideBoxLayout.VARY);
}
};
_model.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
if (_countLabel != null) {
_countLabel.setText("Total row counts: " + ObjectConverterManager.toString(_model.getRowCount()));
}
}
});
_sortableTable.setPreferredScrollableViewportSize(new Dimension(550, 400));
populateTable(10000);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JScrollPane(_sortableTable), BorderLayout.CENTER);
panel.add(navBar, BorderLayout.SOUTH);
return panel;
}
@Override
public String getDemoFolder() {
return "G3.LargeSortableTable";
}
static public void main(String[] s) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
LookAndFeelFactory.installDefaultLookAndFeelAndExtension();
showAsFrame(new LargeSortableTableNavBarDemo());
}
});
}
}
protected void initComponents() {
...
MouseWheelListener[] mouseWheelListeners = _sortableTable.getMouseWheelListeners();
_sortableTable.removeMouseWheelListener(mouseWheelListeners[0]);
}
@Override
protected void setSelectedRecordIndex(int row) {
_sortableTable.getSelectionModel().clearSelection();
_sortableTable.getSelectionModel().setSelectionInterval(row, row);
}
Users browsing this forum: No registered users and 3 guests