Re: Problem faced while u
To: comp.lang.java.gui
On Tue, 24 Jun 2008 02:28:57 -0700 (PDT), Chanchal
<chanchal.jacob@gmail.com> wrote, quoted or indirectly quoted someone
who said :
Also, is there any way to use some other images in place of those up
or down arrows?
Here is how I did the sort arrows prior to the days of TableRowSorter.
import java.awt.Component;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
/**
* renders column headings with up or down
* pointing arrow on sort column depending
* if sort is ascending or descending.
*
* @author Roedy Green
* @version 1.0
* @since 2002 Sep 5
*/
public class SortHeadRenderer implements TableCellRenderer
{
/**
* Constructor
*
* @param sorter associated TableOrderer so we know which
* column is being sorted on.
*/
public SortHeadRenderer ( TableOrderer sorter )
{
this.sorter = sorter;
}
private TableOrderer sorter;
/**
* Returns the component used for drawing the cell. This method is
* used to configure the renderer appropriately before drawing.
*
* @param table the <code>JTable</code> that is asking
the
* renderer to draw; can be
<code>null</code>
* @param value the value of the cell to be rendered.
It is
* up to the specific renderer to
interpret
* and draw the value. For example, if
* <code>value</code>
* is the string "true", it could be
rendered as a
* string or it could be rendered as a
check
* box that is checked. <code>null</code>
is a
* valid value
* @param isSelected true if the cell is to be rendered
with the
* selection highlighted; otherwise false
* @param hasFocus if true, render cell appropriately.
For
* example, put a special border on the
cell, if
* the cell can be edited, render in the
color used
* to indicate editing
* @param row the row index of the cell being drawn.
When
* drawing the header, the value of
* <code>row</code> is -1
* @param column the column index of the cell being
drawn
*/
public Component getTableCellRendererComponent( JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
JLabel label;
// recycle three JLabels over and over.
switch ( sorter.howColumnSorted( column ) )
{
case TableOrderer.ASCENDING :
label = ascendingLabel;
break;
case TableOrderer.DESCENDING :
label = descendingLabel;
break;
default:
case TableOrderer.UNSORTED:
label = unsortedLabel;
break;
}
label.setText( value.toString() );
return label;
}
/**
* Up pointing arrow, indicates ascending sort.
*/
private static JLabel ascendingLabel = new JLabel("ascending");
/**
* Down pointing arrow, indicates descending sort.
*/
private static JLabel descendingLabel = new JLabel("descending");
/**
* No arrow, indicates unsorted.
*/
private static JLabel unsortedLabel = new JLabel("unsorted");
private static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
static {
// get Images as a resources, from jar or from classpath
JLabel[] trio = { ascendingLabel, descendingLabel,
unsortedLabel};
String[] resourceIcon = { "ascending.gif", "descending.gif",
null};
for ( int i=0; i<3; i++ )
{
setIcon ( trio[i], resourceIcon[i] );
trio[i].setForeground( Config.HEADER_FOREGROUND );
trio[i].setBackground( Config.HEADER_BACKGROUND );
// needed to make pay attention to background colour setting.
trio[i].setOpaque( true );
trio[i].setBorder( noFocusBorder );
// label is centred.
trio[i].setHorizontalAlignment( SwingConstants.CENTER );
// text is to left of icon
trio[i].setHorizontalTextPosition( SwingConstants.LEFT );
}
}
/**
* Attach an icon to a JLabel
*
* @param label JLabel to have an icon attached.
*
* @param gif name of resource e.g. "ascending.gif"
* null means no gif
*/
public static void setIcon ( JLabel label, String gif )
{
if ( gif == null )
{
label.setIcon ( null );
}
else
{
URL url = SortHeadRenderer.class.getResource( gif );
Image image = Toolkit.getDefaultToolkit().getImage( url );
ImageIcon icon = new ImageIcon( image );
label.setIcon( icon );
}
}
/**
* hook this renderer up on
* every header column.
*
* @param table Jtable to to use this renderer on.
* @param sorter Associated TableOrderer
*/
public static void install ( JTable jtable, TableOrderer sorter )
{
jtable.setAutoCreateColumnsFromModel( false );
TableCellRenderer renderer = new SortHeadRenderer ( sorter );
TableColumnModel tcm = jtable.getColumnModel();
int cols = tcm.getColumnCount();
for ( int i=0; i<cols; i++ )
{
TableColumn tc = tcm.getColumn( i );
tc.setHeaderRenderer( renderer );
}
}
}
----------------------------------------------------------
Here is how to hook up the mouseListener to notice the request to
change ascending/descending, the old fashioned way:
/**
* Allow user to select a new sort column.
* Works by adding a MouseListener to the column headers.
* Mouse listener fields requests for sorting columns.
* Allows click, shift-click on column to select column and
ascending/descending.
*
* @param table the visible JTable part of the table.
*/
public void allowUserToSelectSortColumn( JTable table )
{
// make available to anonymous inner class
final JTable tableView = table;
tableView.setColumnSelectionAllowed( false );
JTableHeader th = tableView.getTableHeader();
th.addMouseListener(
new MouseAdapter()
{
/**
* Handler for mouse selection of sort
column
* and order. Shift-click means
descending.
*
* @param event Details of event
*/
public void mouseClicked( MouseEvent event
)
{
TableColumnModel columnModel =
tableView.getColumnModel();
int viewColumn =
columnModel.getColumnIndexAtX( event.getX() );
int column =
tableView.convertColumnIndexToModel( viewColumn );
if ( event.getClickCount() == 1 &&
column != -1 )
{
int shiftPressed =
event.getModifiers() & InputEvent.SHIFT_MASK;
boolean ascending = ( shiftPressed
== 0 );
....
}
}
}
);
}
--
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com
---
* Synchronet * The Whitehouse BBS --- whitehouse.hulds.com --- check it out free usenet!
--- Synchronet 3.15a-Win32 NewsLink 1.92
Time Warp of the Future BBS - telnet://time.synchro.net:24