在自定义 CellRenderer 中重写 createToolTip()

2024-07-01

我正在尝试为 JTable 的特定列获取自定义工具提示。我已经创建了一个 CellRenderer(我已经成功更改了其他特定于单元格的属性):

private class CustomCellRenderer extends DefaultTableCellRenderer
{
    private static final long   serialVersionUID    = 1L;

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column)
    {
        JComponent c = (JComponent) super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);

        if (value != null)
        {
            if(column == 1 && value instanceof Date)
            {
                final DateFormat df = new SimpleDateFormat("h:mm aa");
                table.setValueAt(df.format(value), row, column);
            }
            else if(column == 2)
            {
                c.setToolTipText((String) value);
            }
            else if(column == 4)
            {
                final Mail m = main.selectedPage.messages.get(row);
                JCheckBox checkBox;

                if((Boolean) value)
                {
                    checkBox = new JCheckBox()
                    {
                        @Override
                        public JToolTip createToolTip()
                        {
                            System.out.println("Passed");
                            return new ImageToolTip(m.getImage());
                        }
                    };
                    checkBox.setToolTipText(m.attachName);
                }
                else 
                    checkBox = new JCheckBox();

                checkBox.setSelected(((Boolean)value).booleanValue());
                c = checkBox;
            }
        }
        else
        {
            c.setToolTipText(null);
        }
        return c;
    }
}

当我像这样重写任何其他 JComponent 的 createTooltip() 方法时,它在渲染器之外都可以正常工作。

checkBox = new JCheckBox()
{
    @Override
    public JToolTip createToolTip()
    {
        System.out.println("Passed");
        return new ImageToolTip(m.getImage());
    }
};

据我所知,工具提示是在其他地方创建的,因为“通过”甚至从未被打印过。这checkBox.setToolTipText(m.attachName);只会产生带有该字符串的默认工具提示。

我找到了一个拥有类似的问题 https://stackoverflow.com/questions/6042212/override-createtooltip-method-of-jpanel-in-java-swing,但我不能说我完全理解唯一的解决答案。我需要扩展 JTable 并覆盖吗getToolTipText(MouseEvent e)?如果是这样,我不确定如何获得正确的(我的)工具提示。

请原谅我自学的任何怪异行为。提前致谢。 :-)

EDIT:

感谢 Robin,我能够根据 JTable 拼凑出一些东西getToolTipText(MouseEvent e)代码。我将把它留在这里给其他有类似问题的人。再说一次,我不确定这是否是最好的方法,所以请随意在下面批评它。 :-)

messageTable = new JTable()
{
    @Override
    public JToolTip createToolTip()
    {
        Point p = getMousePosition();

        // Locate the renderer under the event location
        int hitColumnIndex = columnAtPoint(p);
        int hitRowIndex = rowAtPoint(p);

        if ((hitColumnIndex != -1) && (hitRowIndex != -1)) 
        {
            TableCellRenderer renderer = getCellRenderer(hitRowIndex, hitColumnIndex);
            Component component = prepareRenderer(renderer, hitRowIndex, hitColumnIndex);

            if (component instanceof JCheckBox) 
            {
                Image img = main.selectedPage.messages.get(hitRowIndex).getImage();
                if(((JCheckBox) component).isSelected())
                    return new ImageToolTip(img);
            }
        }
        return super.createToolTip();
    }
}

您无法为单元格渲染器内的复选框创建工具提示。实际上,当您尝试将鼠标移到该组件上时,该组件并不存在。这只是一个图像。您需要为 JTable 创建工具提示

private void tableMouseMoved(java.awt.event.MouseEvent evt) {
    String toolTipText;
    int row = table.rowAtPoint(evt.getPoint());
    int column = table.columnAtPoint(evt.getPoint());

    if (row >= 0) {
        Object o = table.getValueAt(row, column);
        if (column == YourTableModel.COLUMN_INDEX_WITH_CHECKBOX) {
            Boolean value = (Boolean) o;
            if (value == Boolean.TRUE) {
                toolTipText = "Tooltip text for true value";
            } else {
                toolTipText = "Tooltip text for false value";
            }  
        } 
    }
}

当然,你需要为 MouseEvent 注册监听器:

javax.swing.JTable table = new JTable();
table.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
    public void mouseMoved(java.awt.event.MouseEvent evt) {
        tableMouseMoved(evt);
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在自定义 CellRenderer 中重写 createToolTip() 的相关文章

  • 如何设置两种不同的格式样式并将它们映射到 Eclipse 中的不同快捷方式

    每次在 Eclipse 中打开文件时 我都想将源代码格式化为 Allman 风格的缩进 每次保存时 它都应该格式化为办公室中指定的样式 我可以手动执行此操作并有两个热键 Ctrl Alt PgUp 我的方式 Ctrl Alt Page Do
  • android下拉刷新列表视图出错

    我正在使用功能下拉来刷新library https github com chrisbanes Android PullToRefresh克里斯班斯的 但是当我尝试在我的 xml 文件中导入这个小部件时 它向我显示以下错误 请帮助我如何解决
  • 即使凭据正确,Spring-security 也不会登录用户

    谁能指出我的错误 我一开始无法使用注册用户登录 我以为是因为我正在加密密码 但即使现在我已经删除了编码 即使使用明文密码 用户仍然无法登录 这是我的 web xml
  • 在android 2.3.6中如何通过联系人提供程序获取联系人照片?

    我有这个适用于 android 4 的版本 String email是 Gmail 地址 private Uri getPhotoUriFromEmail String email Uri u null String projection
  • 使用 ThreadCount TestNG 限制并行测试的数量

    我在这里很头疼 我不知道如何处理这个问题 我有几个通过 xml 运行的测试类 约90个测试班 每个班约10 Test进入其中 我配置了一个硒网格 带有maxSession 5因此 单个节点上最多可以并行运行 5 个并行浏览器实例 这是我不明
  • 当生成 Apache CXF 客户端时,为什么在实例化客户端时仍然需要 WSDL?

    我想要使 用 SOAP 服务 但 WSDL 是离线提供给我的 因此导致使用 WSDL 的本地路径生成客户端 public class SoSo extends Service public final static URL WSDL LOC
  • 从批处理文件运行 .jar

    我已经创建了一个可执行文件 jar文件 我怎样才能执行 jar使用批处理文件而不提及类路径 在 Windows 上 您可以使用以下命令 start javaw jar JarFile jar 通过这样做 命令提示符窗口不会保持打开状态
  • 您使用什么来进行复杂的构建过程? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试改进我们的构建过程 目前它是一个巨大的 Ant build xml 它调用其他 ant 构建
  • 什么是运行时绑定?

    根据 Android 开发者指南 Intent 是一个提供运行时绑定独立组件之间 例如两个活动 什么是 运行时绑定 继承创建类型兼容性 它允许超类引用 引用子类的对象 反过来则不然 超类引用 指的是 子类的对象 只能用于 访问继承的和重写的
  • 关于final关键字的java基础知识

    方法中可以使用final关键字吗 绝对地 这final关键字几乎可以应用于任何事物 在每种情况下都意味着 您无法再更改它 这就是它应用于时的含义 一个变量 您根本无法为变量分配新值 将其呈现为constant 当然 a method 您不能
  • 从 android 将用户注册到 QuickBlox 用户

    我正在尝试在我的 Android 应用程序中使用 QuickBlox 我阅读了指南并导入了示例 一切正常 我更改了一些用户可以使用 EditText 作为用户名和另一个密码登录的内容 并且效果很好 但现在我想添加一个注册按钮 使用户能够注册
  • Java:检查数组的相等性(顺序无关紧要)

    我有两个String数组 比方说 String s1 a b c String s2 c a b 这些数组应该相等 我想以 最干净 的方式检查它们的相等性 我尝试使用Arrays equals s1 s2 但我得到了一个错误的答案 我想这个
  • 使用 Spring Security 标记库时将异常映射到 404 页面

    将异常映射到 404 页面时 Spring Security 标记无法从安全上下文中找到身份验证信息 通过 真实 404 可以找到身份验证 我的 web xml
  • 如何向 XML DOM 对象添加命名空间前缀?

    我正在尝试使用特定的命名空间构建 XML 文档 我尝试生成的最终文档应该如下所示
  • 从 Runnable 类内部访问共享变量

    我需要在主类的 main 方法中定义一个共享变量 我需要两个线程才能访问该共享变量 我通过实现 Runnable 接口并实现该接口的抽象 run 方法来创建线程 如何从实现 Runnable 接口的类中定义的 run 方法中引用 Main
  • 如何使用 Spring 使用注释执行基于构造函数的依赖注入?

    好的 如果我需要在构造函数中放入一些原始值 我该怎么做 Autowired public CustomBean String name Qualifier SuperBean SuperBean superBean super this s
  • 如何为所有测试初始化​​一次 Spring applicationContext

    我有一组基于需要 spring 上下文的测试 为了快速执行测试 我想确保 Spring 上下文仅初始化一次 然后所有测试都应该针对该上下文运行 然后应该关闭 我已经尝试过以下方法 Use RunWith SpringJUnit4ClassR
  • 如何为 CompletableFuture::supplyAsync 选择执行器

    CompletableFuture supplyAsync gt IO bound queries 如何为 CompletableFuture supplyAsync 选择执行器以避免污染ForkJoinPool commonPool 里面
  • Java中从long到float的信息丢失[重复]

    这个问题在这里已经有答案了 如果你调用Java的以下方法 void processIt long a float b a do I have loss here 当我将 long 变量分配给 float 变量时 是否会丢失信息 Java 语
  • Spring Security 登录页面

    我开发了一个使用 Spring Security 的默认登录页面的应用程序 不过我想实现我自己的登录页面 我将放置一个login html 而不是jsp 页面 我想使用 JQuery 来实现它 我检查了很多例子但无法实现 我是 Spring

随机推荐