Java - 在JTable

时间:2016-01-28 19:20:40

标签: java image swing jtable

我正在编写一个程序来玩纸牌游戏。我已经让游戏工作,并有效地发挥它,但现在我已经决定添加卡片的图像(现在它可以工作,但使用卡片的名称,如"至于黑桃",而不是图标代表他们。)

在我的程序中,我使用JTable来组织卡片并在各种JDialog中选择它们。我将它们放入(一个用于交换卡片的对话框,另一个用于交换卡片)选择要丢弃的卡等。)

我尝试了什么,我个人喜欢它的工作原理,它为每张卡制作一个包含8列和1行单元格的JTable。并且在每个单元格内部放置卡片的图像。然后我选择一个单元格来选择一张卡片,或者在桌子外面使用JButtonGroup

    DefaultTableModel dtModel = new DefaultTableModel(COL_NAMES, 0) {
        @Override
        public Class<?> getColumnClass(int column) {
            if (getRowCount() > 0)
                return getValueAt(0, column).getClass();
            return super.getColumnClass(column);
        }
    };

    //add the columns to the model:
    if (dtModel.getColumnCount() == 0) {
        for (int i = 0; i < COLS; i++) {
            dtModel.addColumn(COL_NAMES[i]);
        }
    }
    //add a row to the model:
    if (dtModel.getRowCount() == 0) {
        Object[] data = {new JLabel(), new JLabel(), new JLabel(), new JLabel(), new JLabel(), new JLabel(), new JLabel(), new JLabel()}; 
        dtModel.addRow(data);
    }

    jTable1.setModel(dtModel);

    //set the size of the table, but I think I got it wrong:
    jScrollPane1.setSize(400, jScrollPane1.getColumnHeader().getHeight() + jTable1.getRowHeight());

    //here is the image I'm using:
    ImageIcon ii = new ImageIcon("C:\\Users\\DeRipper\\Pictures\\Naipes\\oros_1s.jpg");

    //the loop where I set the image in all the cells. I scale the image into a smaller size:
    for (int i = 0; i < COLS; i++)
        jTable1.setValueAt(new ImageIcon(ii.getImage().getScaledInstance(50, 65, Image.SCALE_DEFAULT)), 0, i);

其中"C:\\Users\\DeRipper\\Pictures\\Naipes\\oros_1s.jpg"是卡片文件的路径。我首先通过为所有单元格放置相同的卡片图像来测试我的代码。

乍一看,我得到了理想的结果,图像显示正确,但是当点击它们时,表格会停止渲染它们,而是显示图像的toString()值:

Card Images in JTable(2)

Card Images in JTable(3)

然后图像不再显示在桌面上。我只需要用户能够点击图像而不会消失。

好的,谢谢你的阅读。

DER。

1 个答案:

答案 0 :(得分:3)

Object[] data = {new JLabel(), new JLabel(), new JLabel(), new JLabel(), new JLabel(), new JLabel(), new JLabel(), new JLabel()}; 
dtModel.addRow(data);

不要将JLabel添加到模型中。相反,您需要添加ImageIcon

然后JTable将使用Icon渲染器显示图像。

Simple Example

  

但是当点击它们时,表格会停止渲染它们,而是显示图像的“toString()”值:

如果您正在编辑单元格,则默认编辑器只会将对象的toString()表示形式保存回TableModel。因此,您可能希望覆盖isCellEditable(...)方法以关闭编辑。否则,您需要一个知道如何编辑和保存ImageIcon的自定义编辑器。