例子是从网上找的代码如下: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;
}
} 运行后改变表格列的宽度就会导致程序严重占用CPU 求高手解答 这是为什么 应该怎么解决???跪求!
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;
}
} 运行后改变表格列的宽度就会导致程序严重占用CPU 求高手解答 这是为什么 应该怎么解决???跪求!
解决方案 »
- repaint未调用paintComponent,百思不得其姐
- 大家都是怎么用matisse的,我感觉很难用
- 通过递归方法调用将文件路径储存到字符数组
- 新手请教
- 网络安全策略终极评估(以Web系统描述)
- java实现系统文件目录树、目录树节点图标自定义
- 〈JAVA 2 核心技术 基础知识/高级特性(第7版)》电子书+源码 推荐下载!!
- 能否将虚拟机捆绑在JAVA应用程序中,不安装虚拟机就能运行应用程序
- 用NetBeans编写界面画图程序的问题,望指教
- Object的Clone规则,不是靠java的继承层次中protected成员访问规则维持的?
- 问个比较小白的问题
- 关于流操作的Java实验作业
你这样写 maxPreferredHeight 每次都被设成 0
造成你每次算出来的的maxPreferredHeight 都要重绘
然后界面就不断重绘,肯定耗cpuclass TableCellTextAreaRenderer extends JTextArea implements TableCellRenderer {
private int maxPreferredHeight = 0;
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;
}
}
这样CPU占用小了很多,拖动的时候cpu占用升高是正常的,因为Swing在重绘class TableCellTextAreaRenderer extends JTextArea implements TableCellRenderer {
private int maxPreferredHeight = 0;
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);
}
if (maxPreferredHeight != getPreferredSize().height) //行高需要变化时才改变maxPreferredHeight
maxPreferredHeight = getPreferredSize().height;
if (table.getRowHeight(row) != maxPreferredHeight) //行高需要变化时才重绘
table.setRowHeight(row, maxPreferredHeight);
setText(value == null ? "" : value.toString());
return this;
}
}
public class CallTaskCellRenderer extends DefaultListCellRenderer{ @Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof Object) {
Object obj= (Object) value;
setText(obj.toString() } return this;
}
}
TableCellRenderer
是不断扫描的,
在这里不断循环的改变组件的大小实在不大可取
这个例子确实不好改
用楼上那个试试吧……
跪求!!
org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, list, jtableName);