Java 在JTable中,删除图像之间的空格

Java 在JTable中,删除图像之间的空格,java,swing,jtable,graphics2d,tablecellrenderer,Java,Swing,Jtable,Graphics2d,Tablecellrenderer,在下图中,您可以看到一个带有两列的JTable 更新 **这些列是隐藏的。所选行后面的红色为 背景色红色仅用于演示** 每行有两张图片 第一张图片是一个png图像,看起来像一个复选框。然后是 将朋友的姓名写入的png图像 图像应该看起来像一个图像,但有一个空间 是否可以删除此空间? 图像没有空间 也许使用JTable 在这种情况下,其他swing“列表”可以做到这一点 创建表的代码 jTableSpriidFriends = new JTable(); jTabl

在下图中,您可以看到一个带有两列的
JTable

更新
**这些列是隐藏的。所选行后面的红色为
背景色红色仅用于演示
**

每行有两张图片

第一张图片是一个png图像,看起来像一个复选框。然后是
将朋友的姓名写入的png图像

图像应该看起来像一个图像,但有一个空间

是否可以删除此空间?
图像没有空间

也许使用
JTable

在这种情况下,其他swing“列表”可以做到这一点

创建表的代码

        jTableSpriidFriends = new JTable();
        jTableSpriidFriends.setRowMargin(0);
        jTableSpriidFriends.setIntercellSpacing(new Dimension(0, 0));
        jTableSpriidFriends.setShowHorizontalLines(false);
        jTableSpriidFriends.setShowVerticalLines(false);
        jTableSpriidFriends.setShowGrid(false);
        m_adapterSpriidFriends = new AbstractTableModelJTableSpriidFriends();
        rendererSpriidFriends = new CellRendererJtableSpriidFriends();
        jTableSpriidFriends.setModel(m_adapterSpriidFriends);
        jTableSpriidFriends.setDefaultRenderer(ImageIcon.class,
rendererSpriidFriends );
        jTableSpriidFriends.setRowSelectionAllowed(true);
        jTableSpriidFriends.addMouseListener(this);
        jTableSpriidFriends.getSelectionModel().addListSelectionListener(this);
        jTableSpriidFriends.setTableHeader(null);

        scrollPaneSpriidFriends = new JScrollPane();
        scrollPaneSpriidFriends.setBounds(11, 55, 176, 264);
        panelSpriid.add(scrollPaneSpriidFriends);
        scrollPaneSpriidFriends.setViewportView(jTableSpriidFriends);

    for (int i=0; i<m_adapterSpriidFriends.getColumnCount(); i++) {
        TableColumn column = jTableSpriidFriends.getColumnModel().getColumn(i);
        if (i==0) column.setPreferredWidth(50);
        if (i==1) column.setPreferredWidth(120);

    }

默认单元格渲染器扩展了JLabel,并将自身用作显示单元格的组件。 JLabel具有图标和文本,两者之间有间隙。也许这就是原因:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (comp instanceof JLabel) {
            JLabel label = (JLabel)comp;
            label.setIconTextGap(0);
        }
        return comp;
    }

});

或者:


默认单元渲染器扩展了JLabel,并将自身用作显示单元的组件。 JLabel具有图标和文本,两者之间有间隙。也许这就是原因:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (comp instanceof JLabel) {
            JLabel label = (JLabel)comp;
            label.setIconTextGap(0);
        }
        return comp;
    }

});

或者:



也许您可以使用带有自定义渲染器的JList。然后,渲染器将获取Sprid friend对象,并使用简单的JPanel和GridLayout构造适当的标签。

也许您可以将JList与自定义渲染器一起使用。然后,渲染器将获取spriid friend对象,并使用简单的JPanel和GridLayout构造适当的标签。

您是否尝试过
myTable.setShowVerticalLines(false)?另请查看
JTable.setIntercellSpacing(维度intercellSpacing)
。setShowVerticalline已设置为false,但我忘记了setIntercellSpacing。设置setIntercellSpacing(新尺寸(0,0))。。。。没有任何区别。为了更快地获得更好的帮助,请使用图标编辑您的问题,您只需使用
UIManager.getIcon(“OptionPane.questionIcon”)
@mKorbel我不知道您谈论的关于“OptionPane.questionIcon”的内容。您能澄清一下吗?由于@mkorbel添加SSCE您是否尝试过myTable.setShowVerticalLines(false)?另请查看
JTable.setIntercellSpacing(维度intercellSpacing)
。setShowVerticalline已设置为false,但我忘记了setIntercellSpacing。设置setIntercellSpacing(新尺寸(0,0))。。。。没有任何区别。为了更快地获得更好的帮助,请使用图标编辑您的问题,您只需使用
UIManager.getIcon(“OptionPane.questionIcon”)
@mKorbel我不知道您谈论的关于“OptionPane.questionIcon”的内容。您能澄清一下吗?通过@mKorbelinteresting添加SSCE将测试一些..AbstractTableModel中的getColumnClass()正在返回ImageIcon.classe我可以从GetTableCellRenderComponent返回其他内容吗?如何返回?该方法以.setText(“”)结尾。。。很好地认识到,一个单一组件可被多个单元重用;因此,每次都会再次设置文本和颜色等属性。您也应该这样做,但组件是不相关的。对于我的答案中的代码,我将给出一个替代方案。有趣的是,我将测试一些..AbstractTableModel中的getColumnClass()正在返回ImageIcon.classe我是否可以从GetTableCellRenderer组件返回其他内容,以及如何返回?该方法以.setText(“”)结尾。。。很好地认识到,一个单一组件可被多个单元重用;因此,每次都会再次设置文本和颜色等属性。您也应该这样做,但组件是不相关的。对于我的答案中的代码,我将给出一个替代方案。从技术上讲,没有。但是您可以使它看起来像渲染器中的两列。使用JList很好。完全删除检查图像,并使用两个大图像,一个带检查,一个不带检查。从技术上讲,没有。但您可以使其看起来像渲染器中的两列。使用JList效果很好。全部删除检查图像,并使用两个大图像,一个带有检查,一个没有。
table.setDefaultRenderer(ImageIcon.class, new DefaultTableCellRenderer() {
    {
        setIconTextGap(0);
    }
});