2013-12-21 2 views
1

JTable 셀 내에서 텍스트를 단어로 감싸는 데 TextAreaRenderer을 사용하고 있습니다. 그러나 내 프로젝트의 사양에서는 텍스트를 가운데 맞춤하는 기능 (가로 및 세로 모두)이 필요합니다. 나는 이것을하는 방법을 이해할 수 없다.TextAreaRenderer가있는 JTable 셀의 가운데 맞춤 텍스트 배열

나는 이미 TextAreaRenderer하는 extends JTextArea를 사용하고 있기 때문에, 나는 setHorizontalAlignment()setVerticalAlignment() 방법에 액세스 할 필요가 DefaultTableCellRenderer을 확장 드릴 수 없습니다 (: How to center in JTable cell a value?를이 질문을보고 답변). 인터페이스가 아니기 때문에 DefaultTableCellRenderer을 구현할 수 없습니다. 내가 사용하고있는 TextAreaRenderer

SSCCE :

import java.awt.Component; 
import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 

public class Test { 

    public static void main(String args[]) { 
     JFrame frame = new JFrame(); 
     JTable table = new JTable(); 
     JScrollPane jsp = new JScrollPane(table); 
     Object[][] data = new Object[2][2]; 
     data[0][0] = 1; 
     data[0][1] = "Super long text just to illustrate word wrap. Super long text just to illustrate word wrap. Super long text just to illustrate word wrap. Super long text just to illustrate word wrap. Super long text just to illustrate word wrap. Super long text just to illustrate word wrap. Super long text just to illustrate word wrap. Super long text just to illustrate word wrap. "; 
     data[1][0] = 2; 
     data[1][1] = "Two Lines/Two Lines"; 
     String[] headers = new String[]{"Digit", "Text"}; 
     table.setModel(new DefaultTableModel(data, headers) { 

      @Override 
      public Class<?> getColumnClass(int columnIndex) { 
       switch(columnIndex){ 
        case 1: return Integer.class; 
        case 2: return String.class; 
        default: return Object.class; 
       } 
      } 
     }); 
     table.getColumnModel().getColumn(1).setCellRenderer(new TextAreaRenderer()); 
     frame.add(jsp); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 



    static class TextAreaRenderer extends JTextArea implements TableCellRenderer { 

     private final DefaultTableCellRenderer adaptee = new DefaultTableCellRenderer(); 
     /** map from table to map of rows to map of column heights */ 
     private final Map cellSizes = new HashMap(); 


     public TextAreaRenderer() { 
      setLineWrap(true); 
      setWrapStyleWord(true); 
     } 

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

      // set the colours, etc. using the standard for that platform 
      adaptee.getTableCellRendererComponent(table, obj, 
        isSelected, hasFocus, row, column); 
      setForeground(adaptee.getForeground()); 
      setBackground(adaptee.getBackground()); 
      setBorder(adaptee.getBorder()); 
      setFont(adaptee.getFont()); 
      setText(adaptee.getText()); 


      // This line was very important to get it working with JDK1.4 
      TableColumnModel columnModel = table.getColumnModel(); 
      setSize(columnModel.getColumn(column).getWidth(), 100000); 
      int height_wanted = (int) getPreferredSize().getHeight(); 
      addSize(table, row, column, height_wanted); 
      height_wanted = findTotalMaximumRowSize(table, row); 
      if (height_wanted != table.getRowHeight(row)) { 
       table.setRowHeight(row, height_wanted); 
      } 
      return this; 
     } 

     @SuppressWarnings("unchecked") 
     private void addSize(JTable table, int row, int column, int height) { 
      Map rows = (Map) cellSizes.get(table); 
      if (rows == null) { 
       cellSizes.put(table, rows = new HashMap()); 
      } 
      Map rowheights = (Map) rows.get(new Integer(row)); 
      if (rowheights == null) { 
       rows.put(new Integer(row), rowheights = new HashMap()); 
      } 
      rowheights.put(new Integer(column), new Integer(height)); 
     } 

     /** 
     * Look through all columns and get the renderer. If it is 
     * also a TextAreaRenderer, we look at the maximum height in 
     * its hash table for this row. 
     */ 
     private int findTotalMaximumRowSize(JTable table, int row) { 
      int maximum_height = 0; 
      Enumeration columns = table.getColumnModel().getColumns(); 
      while (columns.hasMoreElements()) { 
       TableColumn tc = (TableColumn) columns.nextElement(); 
       TableCellRenderer cellRenderer = tc.getCellRenderer(); 
       if (cellRenderer instanceof TextAreaRenderer) { 
        TextAreaRenderer tar = (TextAreaRenderer) cellRenderer; 
        maximum_height = Math.max(maximum_height, 
          tar.findMaximumRowSize(table, row)); 
       } 
      } 
      return maximum_height; 
     } 

     private int findMaximumRowSize(JTable table, int row) { 
      Map rows = (Map) cellSizes.get(table); 
      if (rows == null) { 
       return 0; 
      } 
      Map rowheights = (Map) rows.get(new Integer(row)); 
      if (rowheights == null) { 
       return 0; 
      } 
      int maximum_height = 0; 
      for (Iterator it = rowheights.entrySet().iterator(); 
        it.hasNext();) { 
       Map.Entry entry = (Map.Entry) it.next(); 
       int cellHeight = ((Integer) entry.getValue()).intValue(); 
       maximum_height = Math.max(maximum_height, cellHeight); 
      } 
      return maximum_height; 
     } 
    } 
} 

답변

3

당신은 JTextPane가 아닌 JTextArea에 사용하는 렌더러가 필요하고 문서의 스타일 속성을 설정합니다.

즉, 자세한 내용은

static class TextAreaRenderer extends JTextPane implements TableCellRenderer { 

    private final DefaultTableCellRenderer adaptee = new DefaultTableCellRenderer(); 
    /** map from table to map of rows to map of column heights */ 
    private final Map cellSizes = new HashMap(); 

    public TextAreaRenderer() { 
    // !! setLineWrap(true); 
    // setWrapStyleWord(true); 

    StyledDocument doc = getStyledDocument(); 
    SimpleAttributeSet center = new SimpleAttributeSet(); 
    StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); 
    doc.setParagraphAttributes(0, doc.getLength(), center, false); 
    } 

는 (최대 - 투표) camickr의 대답 here를 참조하십시오.

+1

완벽! 감사합니다 HFOE. – ryvantage

+0

나는 Camickr의 대답을 보았지만'JTextArea'를 사용하고 있었고 작동하지 않았습니다. 'JTextPane'이 트릭을했습니다. – ryvantage

+0

마지막으로 한 가지 문제 : 텍스트를 가운데로 정렬해야합니다 ** 세로로 ** 또한. 그렇게 할 수있는 방법이 있습니까? – ryvantage