Mac X Swing problem

M

mhsampson

Dear group,

I am writing an desktop app that uses a JTable with a special Renderer
for the column headers that parses the text for end-of-line characters
and renders it as a JList. This is so I can show column headings of
more than one line. Example:
+----------------+
| Monday |
| Dec 11 |
+----------------+
| 45 |
+----------------+
| 31 |
+----------------+

The code works fine on Win2KP in Java 1.5.

I have started testing it on a Macintosh with Mac OS X 10.4.8 and Java
1.5. So far, I have found that I have to be more specific in my
PropertyChangeEvent handling code (the Macintosh Swing created more
property change events during normal operation), and that my multiple
line JTable headers do not display.

Does this sound familiar to anyone?

Mike Sampson

Here is the code for the renderer. It is borrowed from somewhere on
the net.

public class MultiLineHeaderRenderer extends JList implements
TableCellRenderer
{
public MultiLineHeaderRenderer()
{
setOpaque(true);
setForeground(UIManager.getColor("TableHeader.foreground"));
setBackground(UIManager.getColor("TableHeader.background"));
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
ListCellRenderer renderer = getCellRenderer();
((JLabel)renderer).setHorizontalAlignment(JLabel.CENTER);
setCellRenderer(renderer);
}

public Component getTableCellRendererComponent(JTable table, Object
value,
boolean isSelected, boolean hasFocus, int row, int
column)
{
setFont(table.getFont());
String str = (value == null) ? "" : value.toString();
BufferedReader br = new BufferedReader(new StringReader(str));
String line;
Vector<String> v = new Vector<String>();
try
{
while ((line = br.readLine()) != null)
{
v.addElement(line);
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
setListData(v);
return this;
}
}
 
D

Daniel Dyer

Dear group,

I am writing an desktop app that uses a JTable with a special Renderer
for the column headers that parses the text for end-of-line characters
and renders it as a JList.

Perhaps an easier approach would be to take advantage of JLabel's support
for HTML
(http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JLabel.html).
Since the DefaultTableCellRenderer extends JLabel, it should just be a
case of wrapping the text in the appropriate tags. Some <BR> tags will
give you multiple lines. You may also have to add <FONT> tags to get the
text to look right.

Dan.
 
M

mhsampson

Thanks. I changed the code as follows, and it works nicely.

Mike Sampson


public class MultiLineHeaderRenderer extends JLabel implements
TableCellRenderer
{
public MultiLineHeaderRenderer()
{
this.setOpaque(true);

this.setForeground(UIManager.getColor("TableHeader.foreground"));

this.setBackground(UIManager.getColor("TableHeader.background"));
this.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
this.setHorizontalAlignment( JLabel.CENTER );
this.setVerticalAlignment( JLabel.TOP );
}

public Component getTableCellRendererComponent(JTable table, Object
value,
boolean isSelected, boolean hasFocus, int row, int
column)
{
setFont(table.getFont());
String str = (value == null) ? "" : value.toString();
BufferedReader br = new BufferedReader(new StringReader(str));
String line;
String htmlText = new String("<HTML>");
int lines = 0;
try
{
while ( (line = br.readLine()) != null )
{

if ( lines > 0 )
{
htmlText += "<P>";
}
htmlText += line;
++lines;
}
htmlText += "</HTML>";
}
catch (IOException ex)
{
ex.printStackTrace();
}
this.setText( htmlText );

return this;
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,787
Messages
2,569,627
Members
45,328
Latest member
66Teonna9

Latest Threads

Top