Re: Problem faced while using TinyLnF



On Tue, 24 Jun 2008 02:28:57 -0700 (PDT), Chanchal
<chanchal.jacob@xxxxxxxxx> 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
.



Relevant Pages

  • Re: wxGrid
    ... I want to sort it when a column label is clicked. ... involves first figuring out which header was clicked. ... You should upgrade to wxPython 2.5.3 (2.5.4 is around the corner ...
    (comp.lang.python)
  • Re: Sortable Java Tree Table
    ... sort in order by app name ... public SortHeadRenderer (TableOrderer sorter) ... used to configure the renderer appropriately before drawing. ... JLabel label; ...
    (comp.lang.java.gui)
  • Re: Inidicator Arrow convention for Sort Order
    ... is in the arrow telling you how the sort is NOW or how you want it to ... A button should be labelled such that what the label says becomes true once the button is clicked. ... I would propose to use an unambiguous convention, ... It is a pictogram which represents the state of the sort order. ...
    (comp.lang.java.gui)
  • Re: how to sort in a protected worksheet.
    ... The rectangle floats over that cell (including the dropdown arrow). ... I have followed this excellent article for giving users the ability to sort ... i have tried protecting only certain columns of data ...
    (microsoft.public.excel.misc)
  • Re: A Bear of Little Brain?
    ... sort of label to enable some sort of categorisation. ... that there Is a distinction. ... Which is something people in many fields would feel a pressure ...
    (uk.rec.sheds)