JTable调用自定义单元格渲染器方法...连续

编程入门 行业动态 更新时间:2024-10-27 10:30:54
本文介绍了JTable调用自定义单元格渲染器方法...连续的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

Compilable来源可在以下网址找到: www.splashcd/jtable.tar

Compilable source can be found at: www.splashcd/jtable.tar

我是该语言的新手,所以我不确定这是不是可接受的行为。

I'm new to the language, so I'm not sure if this is acceptable behavior or not.

我创建了一个JTable来为每个收到的消息显示一行(它每20秒收到一个大约)。其中一个表格列可以包含大量的文本,因此我创建了一个自定义单元格渲染器,其中包含相应的行并设置行高度。

I created a JTable to display a row for each message received (it receives about one every 20 seconds). One of the table columns can contain a large amount of text, so I created a custom cell renderer which word wraps and sets the row height accordingly.

所有这一切都按预期工作,除了一旦表格显示第一行,它会调用单元格渲染器大约每秒十次......直到用户关闭表。

All that works as expected, except that once the table displays its first row, it calls the cell renderer about ten times a second... until the user closes the table.

一旦我在那里得到大约20行,表格变得相当迟缓,需要2-8 秒来调整列的大小,向上或向下scoll,或者渲染一个选定的选择了背景颜色的行。

Once I get approx 20 rows in there, the table gets fairly sluggish, taking 2-8 seconds to resize a column, scoll up or down, or render a selected row with the selected background color.

我在渲染器中插入了一个print语句,所以我可以看到getBableCellRendererComponent方法的多少次被叫。

I inserted a print statement inside the renderer, so I can see how many times the getTableCellRendererComponent method is being called.

我禁用了工具提示,并禁用了所有单元格编辑。我确实有一个监听器,当添加一个新行或者表是调整大小时,将视图滚动到最后一行。

I disabled tool tips, and disabled all cell editing. I do have a listener that scrolls the view to the last row when either a new row is added or the table is resized.

应该当我刚刚查看屏幕(不接触鼠标或键盘)时,getTableCellRendererComponent方法每秒被调用几次?

Should the getTableCellRendererComponent method be called several times a second when I'm just viewing the screen (not touching mouse or keyboard)?

TIA

推荐答案

  • aaaaach

    • aaaaach

      你需要 doLayout(),

      下一级:-),然后你可以设置 JTextComponents 的最大可见行 s,只需很少的努力

      next level :-), then there you can to set Maximum visible rows for JTextComponents too, with little effort

      doLayout()

      doLayout()

      import java.awt.*; import javax.swing.*; import javax.swing.table.*; import javax.swing.text.*; //tips4java.wordpress/2008/10/26/text-utilities/ public class AutoWrapTest { public JComponent makeUI() { String[] columnNames = {" Text Area Cell Renderer "}; Object[][] data = { {"123456789012345678901234567890"}, {"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddx"}, {"----------------------------------------------0"}, {">>>>>>>>>>>>>dddddddddddddddddddddddddddddddddddddddddddddddddd" + "dddddddxdddddddddddddddddddddddddddddddddddddddddddddd" + "dddddddddddx>>>>>>>>>>>>>>>>>>>>>>>>>|"}, {">>>>>>>>>>>>ddddddddddddddddddddddddddddddddddddddddddddddddddd" + "ddddddx>>>>>>>>>>>>>>>>>>>>>>>>>>|"}, {"a|"}, {">>>>>>>>bbbb>>>>>>>>>>>>>>>>>>>|"}, {">>>>>>>>>>>>>>>>>>|"}, {">>>>>>>>>>>>>dddddddddddddddddddddddddddddddddddddddddddddddddd" + "dddddddxdddddddddddddd123456789012345678901234567890dddddd" + "dddddddddddddddddddddddddddddddddddddx>>>>>>>>>>>>>>>>>>>>" + ">>>>>|"}, {">>>>>>>>>>>>>dddddddddddddd123456789012345678901234567890dddddd" + "dddddddddddddddddddddddddddddddddddddxdddddddddddddd123456" + "789012345678901234567890dddddddddddddddddddddddddddddddddd" + "ddddd123456789012345678901234567890ddddx>>>>>>>>>>>>>>>>>>" + ">>>>>>>|"},}; TableModel model = new DefaultTableModel(data, columnNames) { private static final long serialVersionUID = 1L; @Override public boolean isCellEditable(int row, int column) { return false; } }; JTable table = new JTable(model) { private static final long serialVersionUID = 1L; @Override public void doLayout() { TableColumn col = getColumnModel().getColumn(0); for (int row = 0; row < getRowCount(); row++) { Component c = prepareRenderer(col.getCellRenderer(), row, 0); if (c instanceof JTextArea) { JTextArea a = (JTextArea) c; int h = getPreferredHeight(a) + getIntercellSpacing().height; if (getRowHeight(row) != h) { setRowHeight(row, h); } } } super.doLayout(); } private int getPreferredHeight(JTextComponent c) { Insets insets = c.getInsets(); View view = c.getUI().getRootView(c).getView(0); int preferredHeight = (int) view.getPreferredSpan(View.Y_AXIS); return preferredHeight + insets.top + insets.bottom; } }; table.setEnabled(false); table.setShowGrid(false); table.setTableHeader(null); table.getColumnModel().getColumn(0).setCellRenderer(new TextAreaCellRenderer()); //table.setPreferredScrollableViewportSize(table.getPreferredSize()); JScrollPane sp = new JScrollPane(table); sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); sp.setPreferredSize(new Dimension(250, 533)); JPanel p = new JPanel(new BorderLayout()); p.add(sp); return p; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } public static void createAndShowGUI() { JFrame f = new JFrame(); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.getContentPane().add(new AutoWrapTest().makeUI()); f.setLocation(100, 100); f.pack(); f.setVisible(true); } } class TextAreaCellRenderer extends JTextArea implements TableCellRenderer { private static final long serialVersionUID = 1L; private final Color evenColor = new Color(230, 240, 255); public TextAreaCellRenderer() { super(); setLineWrap(true); setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(table.getBackground()); setBackground((row % 2 == 0) ? evenColor : getBackground()); } setFont(table.getFont()); setText((value == null) ? "" : value.toString()); return this; } }

更多推荐

JTable调用自定义单元格渲染器方法...连续

本文发布于:2023-11-23 02:05:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1619700.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自定义   单元格   方法   渲染器   JTable

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!