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;
}
}
}
완벽! 감사합니다 HFOE. – ryvantage
나는 Camickr의 대답을 보았지만'JTextArea'를 사용하고 있었고 작동하지 않았습니다. 'JTextPane'이 트릭을했습니다. – ryvantage
마지막으로 한 가지 문제 : 텍스트를 가운데로 정렬해야합니다 ** 세로로 ** 또한. 그렇게 할 수있는 방법이 있습니까? – ryvantage