Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable、JLabel及其图标(JLabel不能使用图标进行自定义)?_Java_Swing_Icons_Jtable_Jlabel - Fatal编程技术网

Java JTable、JLabel及其图标(JLabel不能使用图标进行自定义)?

Java JTable、JLabel及其图标(JLabel不能使用图标进行自定义)?,java,swing,icons,jtable,jlabel,Java,Swing,Icons,Jtable,Jlabel,我想,这个夏天不是真正的夏天。 一杯咖啡让我感觉它就像一个夏天,很难(哈哈) 我有点淘气。天啊。 下面是我的JTable,它使用我自己定制的TableModel。您可以在它的getColumnClass()方法上看到它,在那里。。。它只用于返回JLabel。 然后,我还自定义默认渲染器 jtbl_inGameEasy = new javax.swing.JTable(); jtbl_inGameEasy.setFont(new java.awt.Font("squeaky chalk sound

我想,这个夏天不是真正的夏天。 一杯咖啡让我感觉它就像一个夏天,很难(哈哈)

我有点淘气。天啊。 下面是我的JTable,它使用我自己定制的TableModel。您可以在它的getColumnClass()方法上看到它,在那里。。。它只用于返回JLabel。 然后,我还自定义默认渲染器

jtbl_inGameEasy = new javax.swing.JTable();
jtbl_inGameEasy.setFont(new java.awt.Font("squeaky chalk sound", 0, 14)); // NOI18N
jtbl_inGameEasy.setForeground(new java.awt.Color(255, 255, 255));
jtbl_inGameEasy.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {

    },
    new String [] {
        "null", "null", "null", "null", "null"
    }
) {
    boolean[] canEdit = new boolean [] {
        false, false, false, false, false
    };

    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return canEdit [columnIndex];
    }
    public Class getColumnClass(int columnIndex) {
        return JLabel.class;
    }
});
jtbl_inGameEasy.setDefaultRenderer(JLabel.class, new JLabelTableRenderer());
jtbl_inGameEasy.setFocusable(false);
jtbl_inGameEasy.setOpaque(false);
jtbl_inGameEasy.setRowHeight(55);
jtbl_inGameEasy.setShowHorizontalLines(false);
jtbl_inGameEasy.setShowVerticalLines(false);
jtbl_inGameEasy.setTableHeader(null);
jtbl_inGameEasy.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mousePressed(java.awt.event.MouseEvent evt) {
        jtbl_inGameEasyMousePressed(evt);
    }
});
那么JTableRenderer在哪里?在这里 这是我下面的自定义渲染器

public class JLabelTableRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {

        if (value instanceof JLabel) {
            //This time return only the JLabel without icon
            return (JLabel) value;
        } else {
            return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        }

    }
}
然后,我需要在每个单元格内放置JLabel。 我开始使用此代码在JTable的单元格上方的数组对象中添加一些JLabel;(这没问题)

我想一切都很好。但由于我的目的是--->在用户点击JTable单元格时放置一个图标,或使其不可见,因此我尝试执行我的鼠标事件一次按下并调用这些代码行

private void jtbl_inGameEasyMousePressed(java.awt.event.MouseEvent evt) {                                             
        // Checking inGameEasy Table Ans
        javax.swing.JTable source = (javax.swing.JTable) evt.getSource();
        int row = source.rowAtPoint(evt.getPoint());
        int column = source.columnAtPoint(evt.getPoint());

        DefaultTableModel o_dtb = (DefaultTableModel) jtbl_inGameEasy.getModel();
        String s_questAns = "" + Game.getCurrentQuestion().getResult();
        String s_userAns = "" + o_dtb.getValueAt(row, column);

// These two lines below are not Working, why yaa??    

    ((JLabel) o_dtb.getValueAt(row, column)).setVisible(false);
((JLabel) o_dtb.getValueAt(row, column)).setIcon(myIcon);

        if (s_questAns.equals(s_userAns)) {
            Game.correct();
            System.err.println("nice ans!");
        } else {
            jll_txtMiss.setText("Miss : " + Game.wrong());
            System.err.println("nope!");
        }

        nextQuestion();
    }               
在我看来,标记的(在注释的下面)代码不起作用。 是的,JLabel铸造无法更改其图标(图像),也无法更改其可见性。这一切都是由模型引起的吗?
注意:我的单元格数据是在模型创建后以不同方式添加的。

在我看来,您要做的只是将所有表格单元格保留为空,用户单击的单元格除外,其中应显示一些标记图标,对吗

如果是这样,表模型不应包含
JLabel
实例。JLabel是一个可视化组件,用于以图形方式呈现某些数据。数据本身不是JLabel。在您的例子中,我认为它应该是一个布尔值(当用户单击时为true,否则为false)

现在,您可以使用自定义渲染器(尽管布尔值的默认渲染器也可以是OK)来显示布尔值。此呈现程序将是
DefaultTableCellRenderer
的子类,它本身就是JLabel的子类。如果要渲染的布尔值为true,则渲染器(配置为使用此渲染器的所有单元格的同一实例)将只显示一个标记的图标,如果要渲染的布尔值为false,则显示一个未标记的图标(或根本没有图标)

然后,单击处理程序将只有一个任务:使单击的单元格包含true而不是false。要做到这一点,只需在表模型中更改适当的值

重述一下:表模型用于保存数据。可以将其视为数据库中的数据。你会在数据库中保存一个JLabel吗?不,您将持有布尔值、字符串或整数。该表可以根据需要呈现这些数据,这是呈现器的任务


旁注:停止使用匈牙利符号:它在Java中没有意义。这使得代码很难阅读。除了基本类型以外的所有类型都是对象,并且不能为每个可能的类型指定有意义的前缀。相反,使用可读且有意义的英文名称:
tableModel
而不是
o_dtb
correctAnswer
而不是
s_questAns
userAnswer
编辑你的文章……哦,对不起,我是问你这个问题!要简明扼要。谢谢,我觉得你把这件事搞得太复杂了!默认情况下,JTable使用JLabel作为大多数对象类型的默认渲染器。因此,您可以简单地在单个单元格中添加一个图标作为onClick事件的一部分,从而减少大量代码。只是问题,应该是TicTacToe、Minesweeper、Pexeso…,方向很好,不用担心,JTable但是默认值在TabelCell中包含JLabel,接受的图标。类也是,请花时间创建示例,您应该以此为基础,确保将相同/相似的是您将装箱JLabel数组或将其放入JTable,只需在TableCell中查找register MouseeEvent(这里有很多示例)JTable将其单元格呈现为JLabel??这是真的吗??我认为他们更喜欢选择对象而不是JLabel@mKorbel:(oya,谢谢你的链接。+1这里有一个相关的
扩展了DefaultTableCellRenderer
实现了Icon
。我的祖母出生在匈牙利,:-)你对此有什么问题吗,或者想跟我说:-),我评论的原因==优秀的描述+1毫克。。。。这就是你们谈论的匈牙利符号!(lol)好吧,好吧,我的Netbeans中有数百个匈牙利变量(我猜)D
private void jtbl_inGameEasyMousePressed(java.awt.event.MouseEvent evt) {                                             
        // Checking inGameEasy Table Ans
        javax.swing.JTable source = (javax.swing.JTable) evt.getSource();
        int row = source.rowAtPoint(evt.getPoint());
        int column = source.columnAtPoint(evt.getPoint());

        DefaultTableModel o_dtb = (DefaultTableModel) jtbl_inGameEasy.getModel();
        String s_questAns = "" + Game.getCurrentQuestion().getResult();
        String s_userAns = "" + o_dtb.getValueAt(row, column);

// These two lines below are not Working, why yaa??    

    ((JLabel) o_dtb.getValueAt(row, column)).setVisible(false);
((JLabel) o_dtb.getValueAt(row, column)).setIcon(myIcon);

        if (s_questAns.equals(s_userAns)) {
            Game.correct();
            System.err.println("nice ans!");
        } else {
            jll_txtMiss.setText("Miss : " + Game.wrong());
            System.err.println("nope!");
        }

        nextQuestion();
    }