2012-04-11 13 views
4

Ich habe eine JTextArea, die ich als CellRenderer für eine Tabelle verwenden. Im getTableCellRenderercomponent Methode, die ich habe:JTextArea als CellRenderer scheint nicht mit Wrap-Stil-Word zu arbeiten

setText(getTextForCell()); 
    setSize(table.getColumnModel().getColumn(column).getWidth(), 0); 
    getUI().getRootView(textArea).setSize(textArea.getWidth(), 0f); 
    updateSize(); 


    private void updateSize() { 
     int prefHeight = textArea.getPreferredSize().height; 
     int currHeight = table.getRowHeight(r); 
     if (prefHeight > currHeight) { 
     table.setRowHeight(row, prefHeight);   
     } 

Wenn der Textbereich wrap Stil Wort verwendet, ist es manchmal eine Reihe kurz.

Wenn ich diese updateSize-Methode von außerhalb getTableCellRendererComponent aufrufen, dann funktioniert es richtig. Aber bei einer großen Tabelle ist das Aufrufen der Aktualisierungsgröße in allen Zeilen immer dann, wenn sich eine Spaltengröße anpasst, nicht durchführbar, da sie zu langsam ist. Daher habe ich nach einer Möglichkeit gesucht, die Größe während des Zeilenrenderings zu ändern.

Es gibt einen verwandten Java-Bug (der als behoben markiert ist, aber es scheint nicht, dass es wirklich ist) http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4446522, aber diese Problemumgehung scheint nicht zu funktionieren, wenn Word-Wrap verwendet wird.

Kann jemand eine Alternative zur Verfügung stellen, wie man diese Arbeit richtig macht?

+1

Warum nicht eine 'ListSelectionListener', die eine benachbarte Platte oder vielleicht füllt [' TablePopupEditor'] (http://stackoverflow.com/a/3591230/ 230513)? – trashgod

+0

Ich bin mir nicht sicher, wie das hier relevant ist ... –

+1

Alternative Möglichkeiten, verpackten Text in einer freundlicheren Komponente anzuzeigen. – trashgod

Antwort

6

Eine Alternative funktioniert

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 
import javax.swing.text.*; 

public class AutoWrapInJTable { 

    public AutoWrapInJTable() { 
     String[] columnNames = {"TextAreaCellRenderer"}; 
     Object[][] data = { 
      {"123456789"}, 
      {"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddx"}, 
      {"----------------------------------------------0"}, 
      {">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>|"},}; 
     TableModel model = new DefaultTableModel(data, columnNames) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public boolean isCellEditable(int row, int column) { 
       return false; 
      } 
     }; 
     JTable table = new JTable(model) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void doLayout() { 
       TableColumn col = getColumnModel().getColumn(0); 
       for (int row = 0; row < getRowCount(); row++) { 
        Component c = prepareRenderer(col.getCellRenderer(), row, 0); 
        if (c instanceof JTextArea) { 
         JTextArea a = (JTextArea) c; 
         int h = getPreferredHeight(a) + getIntercellSpacing().height; 
         if (getRowHeight(row) != h) { 
          setRowHeight(row, h); 
         } 
        } 
       } 
       super.doLayout(); 
      }//http://tips4java.wordpress.com/2008/10/26/text-utilities/ 

      private int getPreferredHeight(JTextComponent c) { 
       Insets insets = c.getInsets(); 
       View view = c.getUI().getRootView(c).getView(0); 
       int preferredHeight = (int) view.getPreferredSpan(View.Y_AXIS); 
       return preferredHeight + insets.top + insets.bottom; 
      } 
     }; 
     table.setEnabled(false); 
     table.setShowGrid(false); 
     table.setTableHeader(null); 
     table.getColumnModel().getColumn(0).setCellRenderer(new TextAreaCellRenderer()); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane sp = new JScrollPane(table); 
     sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     JPanel p = new JPanel(new BorderLayout()); 
     p.add(sp); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.add(p); 
     //f.pack(); 
     f.setSize(200, 200); 
     f.setLocation(150, 150); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       AutoWrapInJTable autoWrapInJTable = new AutoWrapInJTable(); 
      } 
     }); 
    } 
} 

class TextAreaCellRenderer extends JTextArea implements TableCellRenderer { 

    private static final long serialVersionUID = 1L; 
    private final Color evenColor = new Color(230, 240, 255); 

    public TextAreaCellRenderer() { 
     super(); 
     setLineWrap(true); 
     setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 
     if (isSelected) { 
      setForeground(table.getSelectionForeground()); 
      setBackground(table.getSelectionBackground()); 
     } else { 
      setForeground(table.getForeground()); 
      setBackground(table.getBackground()); 
      setBackground((row % 2 == 0) ? evenColor : getBackground()); 
     } 
     setFont(table.getFont()); 
     setText((value == null) ? "" : value.toString()); 
     return this; 
    } 
} 
+0

Bitte veröffentlichen Sie den Snapshot für diese Tabelle. Ich möchte das sehen. –

+1

@YASEER ARAFATH Post ist bearbeitet – mKorbel

+0

@YASEERARAFATH wie faul kann ein Entwickler sein - das Programm ausführen und auf Ihren Monitor schauen .. – kleopatra