Forum Stats

  • 3,757,137 Users
  • 2,251,200 Discussions
  • 7,869,739 Comments

Discussions

JTable - right align in cell even if the text is wider than the cell

843804
843804 Member Posts: 45,751
edited Jun 10, 2005 4:02AM in Swing
Hello!

I want to display text in cells right aligned. When the size of the cell is smaller than the text, the text will be automatically left aligned. E.g:

e.g. text is abcdefgh

|abcd...|

i am interested in right alignment even if the size of the text is bigger than the cell it contains, because the relevant information stands on the right hand side of every entry.
E.g:

|...fgh|

or something like that.

thnx!

Comments

  • 843804
    843804 Member Posts: 45,751
    There are several good responses to this on these forums. Basically you need to implement custom table cell renderering and set text alignment.

    Cheers
    DB
  • 843804
    843804 Member Posts: 45,751
    To be honest I have already implemented an own cell rendering - after I read lot of responses related to this topic, but only text alignment does not solve the problem I sketched.

    here you can see:

    public Component getTableCellRendererComponent (...){
    Component comp = super.getTableCellRendererComponent(...);
    JLabel currentCell = (JLabel) comp;
    currentCell.setHorizontalAlignment(JLabel.RIGHT);
    return currentCell;
    }
  • camickr
    camickr Member Posts: 24,931
    Maybe something like this:
    import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class TableLeftDotRenderer extends JFrame
    {
    	JTable table;
    
    	public TableLeftDotRenderer()
    	{
    		String[] columnNames = {"Default", "Left Dot"};
    		Object[][] data =
    		{
    			{"A1234567890", "A1234567890"},
    			{"qwertyasdfghzxcvbn", "qwertyasdfghzxcvbn"}
    		};
    
    		DefaultTableModel model = new DefaultTableModel(data, columnNames);
    		table = new JTable( model );
    		table.setPreferredScrollableViewportSize(table.getPreferredSize());
    		JScrollPane scrollPane = new JScrollPane( table );
    		getContentPane().add( scrollPane );
    
    		//  Override default renderer for a specific column
    		DefaultTableCellRenderer leftDotRenderer = new LeftDotRenderer();
    		table.getColumnModel().getColumn(1).setCellRenderer( leftDotRenderer );
    	}
    
    	public static void main(String[] args)
    	{
    		TableLeftDotRenderer frame = new TableLeftDotRenderer();
    		frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
    		frame.pack();
    		frame.setLocationRelativeTo( null );
    		frame.setVisible(true);
    	}
    
    	class LeftDotRenderer extends DefaultTableCellRenderer
    	{
    		public Component getTableCellRendererComponent(
    			JTable table, Object value, boolean isSelected,
    			boolean hasFocus, int row, int column)
    		{
    			super.getTableCellRendererComponent(table, value,
    				isSelected, hasFocus, row, column);
    
    			int availableWidth = table.getColumnModel().getColumn(column).getWidth();
    			availableWidth -= table.getIntercellSpacing().getWidth();
    			Insets borderInsets = getBorder().getBorderInsets((Component)this);
    			availableWidth -= (borderInsets.left + borderInsets.right);
    			String cellText = getText();
    			FontMetrics fm = getFontMetrics( getFont() );
    
    			if (fm.stringWidth(cellText) > availableWidth)
    			{
    				String dots = "...";
    				int textWidth = fm.stringWidth( dots );
    				int nChars = cellText.length() - 1;
    				for (; nChars > 0; nChars--)
    				{
    					textWidth += fm.charWidth(cellText.charAt(nChars));
    
    					if (textWidth > availableWidth)
    					{
    						break;
    					}
    				}
    
    				setText( dots + cellText.substring(nChars + 1) );
    			}
    
    			return this;
    		}
    	}
    }
  • 843804
    843804 Member Posts: 45,751
    H!

    Thanks for this solution, this is what I meant and works perfectly!

    eha
This discussion has been closed.