4 Replies Latest reply on Jun 10, 2005 8:02 AM by 843804

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

    843804
      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!
        • 1. Re: JTable - right align in cell even if the text  is wider than the cell
          843804
          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
          • 2. Re: JTable - right align in cell even if the text  is wider than the cell
            843804
            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;
            }
            • 3. Re: JTable - right align in cell even if the text  is wider than the cell
              camickr
              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;
                        }
                   }
              }
              • 4. Re: JTable - right align in cell even if the text  is wider than the cell
                843804
                H!

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

                eha