Zeilenumbruch in JTable

darksmilie

Erfahrenes Mitglied
Hi

Weiß einer wie ich ein Zeilenumbruch in einer JTable erzeugt?

ich befülle meine Zellen mit Strings die mittendrin "\n" haben, aber leider wird dieser Befehl von der JTable nicht berüchsichtigt.
 
nee mit html klapps auch nicht, aber ich werde mir dann wohl einfach ein eigenen CellRenderer schreiben, der dies macht ;).
 
Hi,
du musst den TableCellRenderer austauschen.
Die Standard-TableCellRendererComponent ist ein JLabel, und die kann keine Zeilenumbrüche.
D.h., du musst eine neue Klasse schreiben, die die Schnittstelle TableCellRenderer implementiert. Diese Schnittstelle definiert eine einzige Methode
Code:
Component getTableCellRendererComponent(JTable table, Object value,
				  boolean isSelected, boolean hasFocus, 
				  int row, int column);
und die Component, die hier zurückgegeben wird, muss z.B. ein JEditorPane sein, der Zeilenumbrüche erkennt.

Hier ein Beispiel, wie ein eigener TableCellRenderer aussehen kann
Code:
public class MultiLineRenderer extends DefaultTableCellRenderer {
    private JEditorPane m_txt;
    private Border m_border;
    private Border m_emptyBorder;
    
    private Color   m_colForeground = null;
    private Color   m_colBackground = null;
    private Color   m_colSelectionForeground = null;
    private Color   m_colSelectionBackground = null;
   
    public MultiLineRenderer( boolean bAutoResize, JTable tblSlave ) {
       
        m_txt = new JEditorPane();
        m_txt.setMargin( new Insets(0, 1, 1, 1 ) );
       
        m_border = BorderFactory.createLineBorder( Color.BLUE );
        m_emptyBorder = BorderFactory.createEmptyBorder();
      
        initColors();
    }
    
    private void initColors() {     
        m_colSelectionForeground = UIManager.getLookAndFeelDefaults().getColor("Table.selectionForeground");            
        m_colForeground = UIManager.getLookAndFeelDefaults().getColor("Table.foreground");
  
        m_colSelectionBackground = UIManager.getLookAndFeelDefaults().getColor("Table.selectionBackground");
        m_colBackground = UIManager.getLookAndFeelDefaults().getColor("Table.background");
    }
    

    public Component getTableCellRendererComponent(
            JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column) {

        
        String s = (String)value;        
        
        Font font = table.getFont();
        if( !( m_txt.getFont().equals( font ) ) ) {
            m_txt.setFont( font );
        }
        
        m_txt.setText( s );

        if (isSelected) {                    
            m_txt.setForeground( m_colSelectionForeground );
            m_txt.setBackground( m_colSelectionBackground );           
        } else {            
            m_txt.setForeground( m_colForeground );
            m_txt.setBackground( m_colBackground );
        }
        

        if (hasFocus) {            
            setBorder( UIManager.getBorder("Table.focusCellHighlightBorder") );
            
            if (!isSelected && table.isCellEditable(row, column)) {               
                Color col;
                col = UIManager.getColor("Table.focusCellForeground");
                if (col != null) {
                    m_txt.setForeground(col);
                }
                col = UIManager.getColor("Table.focusCellBackground");
                if (col != null) {
                    m_txt.setBackground(col);
                }
            }
        } else {
            setBorder(noFocusBorder);
        }       
                
        return m_txt;
    }
}

In deine Table bindest du ihn so ein:
Code:
<JTable>.setDefaultRenderer( String.class, rend );

Übrigens: das Codebeispiel für den Renderer ist aus einem meiner alten Projekte, ich habe wesentliche Teile, die hier nicht hergehören, rausgeschmissen - also wundere dich nicht, wenn es nicht auf Anhieb funktioniert.

Viel Spaß beim Basteln.
Grüße
testalucida
 
Zurück