【问题标题】:JTable, JLabel, and its Icon (JLabel can't be customized with Icon)?JTable、JLabel及其Icon(JLabel不能用Icon自定义)?
【发布时间】:2011-10-31 12:21:29
【问题描述】:

这个夏天不是一个真正的夏天,我想。 一杯咖啡让我感觉像夏天一样,艰难(笑)。

我有一点调皮的 JTable。我的天啊。 下面是使用我自己定制的 TableModel 的 JTable。你可以在它的 getColumnClass() 方法上看到它,那里......它只用于返回 JLabel。 然后,我还自定义 DefaultRenderer。

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 放入每个 Cell 中。 我开始使用此代码在 JTable 的单元格上的数组对象内添加一些 JLabel; (没问题)。

DefaultTableModel o_dtb = jtbl_inGameEasy.getModel();
o_dtb.addRow(myArrayCustomizedObjectofJLabel);

一切正常,我猜。但是因为我的目的是 ---> 放置一个 Icon 或使其在 用户单击 JTable Cells 时使其不可见,因此我尝试执行我的 MouseEvent 一次 按下 并调用这些代码行;

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();
    }               

在我看来,上面的 Marked(在 commented 下方)代码不起作用。 是的,投射的 JLabel 无法更改其图标(图像),也无法更改其可见性。是不是模型导致了这一切? 注意:我的细胞数据是在模型创建后稍后添加的。

【问题讨论】:

  • 编辑你的文章......哦,对不起,我的意思是问题!让它简短而正确。谢谢
  • 我认为你过于复杂了!默认情况下,JTable 使用 JLabel 作为大多数对象类型的默认渲染器。因此,您可以简单地将一个图标添加到单个单元格作为 onClick 事件的一部分,从而减少大量代码。
  • 只是一个问题,应该是井字游戏、扫雷、Pexeso...,方向很好,不用担心,JTable 但默认在TabelCell 中包含JLabel,也接受Icon.Class,请是时候创建示例了,您应该使用stackoverflow.com/questions/7049494/how-to-get-icon-from-jtable/… 作为基础,请确保您将创建 JLabels 数组或将其放入 JTable 中,您只需在 TableCell 中查找 register MouseEvent (这里有很多例子)
  • JTable 将其单元格呈现为 JLabel ??真的吗??我认为他们更喜欢选择 Object 而不是 JLabel .... @mKorbel :( oya,感谢链接。

标签: java swing icons jtable jlabel


【解决方案1】:

在我看来,您想要做的只是将所有表格单元格留空,除了用户单击的单元格之外,应该出现一些标记图标,对吧?

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

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

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

回顾一下:表模型用于保存数据。将其视为您将在数据库中找到的数据。你会在数据库中保存一个 JLabel 吗?不,你会持有一个布尔值、一个字符串或一个整数。表格可以随心所欲地渲染这些数据,这就是渲染器的使命。

旁注:停止使用匈牙利符号:它在 Java 中没有意义。它使代码难以阅读。除了原始类型之外的所有东西都是一个对象,你不能为每个可能的类型分配一个有意义的前缀。而是使用可读且有意义的英文名称:tableModel 而不是 o_dtb、correctAnswer 而不是 s_questAns、userAnswer 而不是 s_userAns。

【讨论】:

  • +1 这是一个相关的example extends DefaultTableCellRenderer 和 implements Icon。
  • 我的祖母出生在匈牙利,:-) 你有什么问题吗,或者想和我一起:-),我评论的原因 == 优秀的描述 +1
  • omg.... 这就是你们所说的匈牙利符号! (大声笑)好吧,好吧,我的 Netbeans 中有数百个匈牙利变量(我猜)。 :D
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 2011-06-05
  • 2016-10-10
  • 2019-06-15
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多