当前位置: 首页 > 知识库问答 >
问题:

JTable调用自定义单元格呈现器方法...连续的

危晨
2023-03-14

所有这些都如预期的那样工作,只是一旦表显示了它的第一行,它就会每秒调用单元格呈现器大约十次...直到用户关闭表。

一旦我在其中得到大约20行,表格变得相当缓慢,需要2-8秒来调整列的大小,向上或向下scoll,或用选定的背景色呈现选定的行。

我在呈现器中插入了一个print语句,这样我就可以看到getTableCellRendererComponent方法被调用了多少次。

共有1个答案

雷曜灿
2023-03-14

>

  • aaaach

    您需要dolayout()

    下一层:-),然后您也可以为JTextComponents设置最大可见行

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import javax.swing.text.*;
    //http://tips4java.wordpress.com/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,它在图像中给出结果 我使用一个扩展JPanel的单独类创建了第一个表格单元格中显示的面板。并将表值添加为, 这是我的表格自定义类来创建这个表格, 我的问题是认为面板如我预期的那样显示,我不能在文本字段中键入或更改复选框或单击按钮。请告诉我如何解决这个问题。

    • 我有一个JTable,其中添加了一个JButton(Delete button)和一个JComboBox作为两列上的自定义单元格编辑器。现在,当我在组合框中选择一个项目并单击Delete按钮时,所选行被删除,但已删除行的组合框在该行上呈现。我是否也必须从表中删除单元编辑器。如果我不选择我的组合框,代码就可以正常工作。请帮帮我。 我的代码是这样的:- 我在main中实例化了我的类的一个对象,然后单击

    • 问题内容: 我正在跟踪发现的一些代码,(是的,我知道它是如何工作的)它来自这里:代码链接 我想做的是如果单元格值设置为“黄色”,则设置单元格前景色 这是我的代码: 和单元格渲染器 问题是,如果我将任何单元格值设置为“黄色”,它就不会改变 提前致谢! 问题答案: 您的渲染器曾经使用过吗?您将其设置为包含String的单元格的默认渲染器,但是是否重载了模型的方法,以便它知道某些单元格包含String

    • 我已经声明了一个用于iOS的自定义渲染器(和Android-工作正常)。 自定义呈现器主要设置背景色和文本颜色。 设置文本颜色对启用和禁用状态都很好,但我在不同状态下设置按钮的背景颜色时遇到了麻烦。 我无法找到任何关于Xamarin自定义呈现器的文档,而且Xamarin的一个已知错误是,我无法在Visual Studio中获得任何适用于iOS类的智能感知,到目前为止,我已经使用了我能找到的关于该主

    • 下面是一个包含两列两行的简单表的代码。是否有人可以修改它,或者用简单的术语来解释,我如何为行标题的目的呈现最左边的列。 谢谢你。

    • 问题内容: 我正在使用几个Kafka连接器,但在控制台输出中看不到它们的创建/部署中的任何错误,但是我没有得到想要的结果(无论是任何结果,无论是期望的还是除此以外)。我基于Kafka的示例FileStream连接器制作了这些连接器,因此我的调试技术基于该示例中使用的SLF4J Logger的使用。我搜索了我认为会在控制台输出中产生的日志消息,但无济于事。我在这些消息中找错了地方吗?还是有调试这些连