这段程序是关于 JTable单元格自动换行的例子程序
如下:
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*; class C extends JFrame {
public C() {
JTable tbl = new JTable(new String[][]{{
"JTable 里单元格内容的显示器是 TableCellRenderer。",
"默认的显示器(DefaultTableCellRenderer)继承 JLabel 所以不方便多行显示。",
"要多行显示应该继承 JTextArea(参看下面的 TableCellTextAreaRenderer 类)。",
"当然,别忘了调用 JTable.setDefaultRenderer() 登记你的显示器。"}},
"A B C D".split(" "));
tbl.setDefaultRenderer(Object.class, new TableCellTextAreaRenderer()); add(new JScrollPane(tbl));
setSize(800, 200);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} public static void main(String[] args) { new C(); }
} class TableCellTextAreaRenderer extends JTextArea implements TableCellRenderer {
public TableCellTextAreaRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
} public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// 计算当下行的最佳高度
int maxPreferredHeight = 0;
for (int i = 0; i < table.getColumnCount(); i++) {
setText("" + table.getValueAt(row, i));
setSize(table.getColumnModel().getColumn(column).getWidth(), 0);
maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height);
} if (table.getRowHeight(row) != maxPreferredHeight) // 少了这行则处理器瞎忙
table.setRowHeight(row, maxPreferredHeight); setText(value == null ? "" : value.toString());
return this;
}
} 现在遇到的问题是: 当我手动改变 Jtable 的列宽的时候,cpu利用率就达到100%, 怎样解决呢
如下:
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*; class C extends JFrame {
public C() {
JTable tbl = new JTable(new String[][]{{
"JTable 里单元格内容的显示器是 TableCellRenderer。",
"默认的显示器(DefaultTableCellRenderer)继承 JLabel 所以不方便多行显示。",
"要多行显示应该继承 JTextArea(参看下面的 TableCellTextAreaRenderer 类)。",
"当然,别忘了调用 JTable.setDefaultRenderer() 登记你的显示器。"}},
"A B C D".split(" "));
tbl.setDefaultRenderer(Object.class, new TableCellTextAreaRenderer()); add(new JScrollPane(tbl));
setSize(800, 200);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} public static void main(String[] args) { new C(); }
} class TableCellTextAreaRenderer extends JTextArea implements TableCellRenderer {
public TableCellTextAreaRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
} public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// 计算当下行的最佳高度
int maxPreferredHeight = 0;
for (int i = 0; i < table.getColumnCount(); i++) {
setText("" + table.getValueAt(row, i));
setSize(table.getColumnModel().getColumn(column).getWidth(), 0);
maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height);
} if (table.getRowHeight(row) != maxPreferredHeight) // 少了这行则处理器瞎忙
table.setRowHeight(row, maxPreferredHeight); setText(value == null ? "" : value.toString());
return this;
}
} 现在遇到的问题是: 当我手动改变 Jtable 的列宽的时候,cpu利用率就达到100%, 怎样解决呢
setText("" + table.getValueAt(row, i));
setSize(table.getColumnModel().getColumn(column).getWidth(), 0);
maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height);
} 这个for循环不需要.
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// \u8BA1算当下行的最佳高度
int maxPreferredHeight = 0;
setSize(table.getColumnModel().getColumn(column).getWidth(), 0);
maxPreferredHeight = Math.max(maxPreferredHeight,
getPreferredSize().height);
if (table.getRowHeight(row) != maxPreferredHeight) { // 少了\u8FD9行\u5219\u5904理器瞎忙
table.setRowHeight(row, maxPreferredHeight);
} setText(value == null ? "" : value.toString());
return this;
}
maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height);
去掉不行吧大家有没有更好的关于自动换行的例子
Returns the component used for drawing the cell.然而在方法执行后,却又返回this存在死循环的嫌疑如果你在类中增加一个static变量:
private static int counter = 0;
再在方法中添加个计数器:
System.out.println(counter);
counter++;程序运行时,变量值很快就会增加到几千,这是执行速度缓慢的原因。另外,使用HTML标签可以实现换行,但是自动化还是有点难度的,请参考官方资料:
http://java.sun.com/docs/books/tutorial/uiswing/components/html.html