程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Java Swing,尝试用图像图标复选框替换JTable中的布尔复选框大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Java Swing,尝试用图像图标复选框替换JTable中的布尔复选框?

开发过程中遇到Java Swing,尝试用图像图标复选框替换JTable中的布尔复选框的问题如何解决?下面主要结合日常开发的经验,给出你关于Java Swing,尝试用图像图标复选框替换JTable中的布尔复选框的解决方法建议,希望对你解决Java Swing,尝试用图像图标复选框替换JTable中的布尔复选框有所启发或帮助;

您需要提供自己的自定义tableCellRenderer功能,该功能能够提供所需的功能…

import java.awt.borderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JcheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JscrollPane;
import javax.swing.Jtable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstracttableModel;
import javax.swing.table.tableCellRenderer;
import javax.swing.table.tableModel;

public class TesttableRenderer {

    public static voID main(String[] args) {
        new TesttableRenderer();
    }

    public TesttableRenderer() {
        EventQueue.invokelater(new Runnable() {
            @OverrIDe
            public voID run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassname());
                } catch (ClassnotFoundException | InstantiationException | illegalaccessexception | UnsupportedLookAndFeelException eX) {
                }

                JFrame frame = new JFrame("TesTing");
                frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new borderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLOCATIOnrelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            tableModel model = new AbstracttableModel() {

                @OverrIDe
                public int getRowCount() {
                    return 2;
                }

                @OverrIDe
                public int getcolumnCount() {
                    return 1;
                }

                @OverrIDe
                public Object getValueAt(int rowIndex, int columnIndeX) {
                    return rowIndex == 0 ? true : false;
                }

                @OverrIDe
                public Class<?> getcolumnClass(int columnIndeX) {
                    return Boolean.class;
                }

            };
            Jtable table = new Jtable(model);
            table.setDefaultRenderer(Boolean.class, new CustomBooleanCellRenderer());
            setLayout(new borderLayout());
            add(new JscrollPane(tablE));
        }

        @OverrIDe
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }

    public class CustomBooleanCellRenderer extends JcheckBox implements tableCellRenderer {

        private ImageIcon sad;
        private ImageIcon happy;

        public CustomBooleanCellRenderer() {
            try {
                happy = new ImageIcon(ImageIO.read(getClass().get@R_674_5550@e("/Happy.png")));
                sad = new ImageIcon(ImageIO.read(getClass().get@R_674_5550@e("/Sad.png")));
            } catch (IOException eX) {
                Logger.getLogger(TesttableRenderer.class.getname()).log(Level.SEVERE, null, eX);
            }
        }

        @OverrIDe
        public voID setSELEcted(Boolean SELEcted) {
            super.setSELEcted(SELEcted); 
            if (SELEcted) {
                setIcon(happy);
            } else {
                setIcon(sad);
            }
        }

        @OverrIDe
        public Component gettableCellRendererComponent(Jtable table, Object value, Boolean isSELEcted, Boolean hasFocus, int row, int column) {
            if (value instanceof Boolean) {
                Boolean SELEcted = (Boolean) value;
                setSELEcted(SELEcted);
            }
            return this;
        }
    }
}

现在,您可以轻松地使用aJLabel或DefaulttableCellRenderer, 检查/的Object值并相应地设置图标……但 这样做的乐趣何在?)truefalse

已更新,包括编辑器…

我已经稍微重新排列了代码,以包括单元格编辑器…

public class CustomcatheckBox extends JcheckBox {

    private ImageIcon sad;
    private ImageIcon happy;

    public CustomcatheckBox() {
        try {
            happy = new ImageIcon(ImageIO.read(getClass().get@R_674_5550@e("/Happy.png")));
            sad = new ImageIcon(ImageIO.read(getClass().get@R_674_5550@e("/Sad.png")));
        } catch (IOException eX) {
            ex.printstacktrace();
        }
    }

    @OverrIDe
    public voID setSELEcted(Boolean SELEcted) {
        super.setSELEcted(SELEcted);
        if (SELEcted) {
            setIcon(happy);
        } else {
            setIcon(sad);
        }
    }

}

public class CustomBooleanCellRenderer extends CustomcatheckBox implements tableCellRenderer {

    @OverrIDe
    public Component gettableCellRendererComponent(Jtable table, Object value, Boolean isSELEcted, Boolean hasFocus, int row, int column) {
        if (value instanceof Boolean) {
            Boolean SELEcted = (Boolean) value;
            setSELEcted(SELEcted);
        }
        return this;
    }

}

public class CustomBooleanCellEditor extends AbstractCellEditor implements tableCellEditor {

    private CustomcatheckBox editor;

    public CustomBooleanCellEditor() {
        editor = new CustomcatheckBox();
    }

    @OverrIDe
    public Component gettableCellEditorComponent(Jtable table, Object value, Boolean isSELEcted, int row, int column) {
        if (value instanceof Boolean) {
            Boolean SELEcted = (Boolean) value;
            editor.setSELEcted(SELEcted);
        }
        return editor;
    }

    @OverrIDe
    public Object getCellEditorValue() {
        return editor.isSELEcted();
    }

}

You can apply the in a similar way you dID the renderer…

table.setDefaultEditor(Boolean.class, new CustomBooleanCellEditor());

解决方法

所以我有一个带有复选框的JTable。我想让复选框
在“选中”时包含一个图像,而在“未选中”时包含另一个图像
(即,显示图像而不是选中或未选中的框)。是否
有办法做到这一点?我试着用TableCellRenderer愚弄它
返回带有ImageIcon的JLabel,但是它并不是非常有效。

更具体地说,当复选框处于选中状态或未选中状态时,右侧的图像
会出现,但是当用户更改复选框状态(鼠标处于
按下状态)时,将显示原始选中/未选中的图像

这是我尝试过的TableCellRenderer(我也使用JPanels尝试过,但这
同样无效

public class CrassusEventTableCellEyeRenderer extends JcheckBox implements TableCellRenderer {

    static Icon greyEye;
    static Icon blackEye;

    {//STATIC CODE BLOCK
        try {
            greyEye = new ImageIcon(ImageIO.read(new File("icons/shittyTest.png")));

            blackEye = new ImageIcon(ImageIO.read(new File("icons/blackEye.png")));
        } catch (IOException E) {
            greyEye = null;
            blackEye = null;
        }
    }

    public CrassusEventTableCellEyeRenderer(){
        super();
        this.addItemListener(new IscheckedItemListener());
        setIcon(greyEyE);
    }

//commented out code that I have tried in place of the IscheckedItemListener
    /*
    @Override
    public void setSELEcted(Boolean sel){
        super.isSELEcted();
        if(sel)
            setIcon(blackEyE);
        else
            setIcon(greyEyE);
    }
    */

    public class IscheckedItemListener implements ItemListener{

        @Override
        public void itemStateChanged(ItemEvent E) {
            if(isSELEcted())
                setIcon(blackEyE);
            else
                setIcon(greyEyE);
        }

    }

    @Override
    public Component getTableCellRendererComponent(JTable table,Object value,Boolean isSELEcted,Boolean hasFocus,int row,int column) {
        System.out.println("value: "+value+",row: "+row+",column: "+column);
        if(value instanceof Boolean){
            setSELEcted(((Boolean) value).BooleanValue());
        }
        return this;
    }

}

大佬总结

以上是大佬教程为你收集整理的Java Swing,尝试用图像图标复选框替换JTable中的布尔复选框全部内容,希望文章能够帮你解决Java Swing,尝试用图像图标复选框替换JTable中的布尔复选框所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。