2016-01-21 46 views
1

我有以下TableCellRenderer(NOT DefaultTableCellRenderer),讓我跳過線在我JTable的細胞:設置JTable中列水平對齊,而無需使用DefaultTableCellRenderer

import java.awt.Color; 
import java.awt.Component; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.table.TableCellRenderer; 

public class MyCellRenderer extends JTextArea implements TableCellRenderer { 

    Color highlightBackground = (Color) UIManager.get("Table.selectionBackground"); 

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

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    setText((String) value); //or something in value, like value.getNote()... 
    setSize(table.getColumnModel().getColumn(column).getWidth(), getPreferredSize().height); 
    if (table.getRowHeight(row) != getPreferredSize().height) { 
     table.setRowHeight(row, getPreferredSize().height); 
    } 
    if (table.isRowSelected(row)) { 
     this.setBackground(highlightBackground); 
    } else { 
     this.setBackground(Color.WHITE); 
    } 
    return this; 
    } 
} 

我只是想改變的水平對齊方式這個渲染器。 (意思是細胞的文字會在中間或者右邊,現在就剩下了)。

以下是我用這個的TableCellRenderer:

Table.getColumnModel().getColumn(1).setCellRenderer(new MyCellRenderer()); 

enter image description here

+0

你所說的渲染器的水平對齊是什麼意思?你的意思是細胞的排列? – SomeDude

+0

沒有必要調用'setSize','JTable'會自己做。更改對齊到什麼? – MadProgrammer

回答

2

我找到了答案,謝謝TT。對於提示,我只是刪除了自定義構造函數及其linewrap,擴展了JTextPane,並添加了幾行代碼。 的人誰需要,允許跳過線&設置細胞的水平對齊方式的類,下面的代碼:

import java.awt.Color; 
import java.awt.Component; 
import javax.swing.JTable; 
import javax.swing.JTextPane; 
import javax.swing.UIManager; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.StyledDocument; 

public class MyCellRenderer extends JTextPane implements TableCellRenderer { 

Color highlightBackground = (Color) UIManager.get("Table.selectionBackground"); 

@Override 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    setText((String) value);//or something in value, like value.getNote()... 
    setSize(table.getColumnModel().getColumn(column).getWidth(), 
      getPreferredSize().height); 
    if (table.getRowHeight(row) != getPreferredSize().height) { 
     table.setRowHeight(row, getPreferredSize().height); 
    } 
    if (table.isRowSelected(row)) { 
     this.setBackground(highlightBackground); 
    } else { 
     this.setBackground(Color.WHITE); 
    } 

    //Added lines 
    StyledDocument doc = this.getStyledDocument(); 
    SimpleAttributeSet center = new SimpleAttributeSet(); 
    StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); 
    doc.setParagraphAttributes(0, doc.getLength(), center, false); 
    //Added Lines 

    return this; 
} 
} 
2

沒有辦法用JTextArea中做到這一點。

單元格渲染應該不是擴展JTextPane的,所以你可以從你的getTableCellRendererComponent實現或渲染器的構造函數中調用:

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

如果你想中心。在StackOverflow上從this answer無恥地插入。

+0

這隻適用於JTextPane,不適用於JTextArea。 – camickr

+0

@camickr Hmz好點=)所以回到setAlignmentY我想 –

+0

@camickr你在類似這些東西看你的用戶配置文件的東西EXP ...你認爲JTextArea將是一個很好的組件延長,或他會更好關閉擴展JTextPane? –