Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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中渲染图像_Java_Image_Swing_Jtable - Fatal编程技术网

Java-在JTable中渲染图像

Java-在JTable中渲染图像,java,image,swing,jtable,Java,Image,Swing,Jtable,我正在写一个玩纸牌游戏的程序。我已经让这个游戏发挥了作用,并且有效地玩了它,但是现在我决定添加卡片的图像(现在它可以工作,但是使用卡片的名称,比如“作为黑桃”,而不是一个图标来表示它们) 在我的程序中,我使用JTables来组织卡,并在各种JDialogs中选择它们(一个对话框用于交换手中的卡,另一个对话框用于选择要丢弃的卡,等等) 我所尝试的,而且我个人喜欢它的工作方式,就是制作一个JTable,每个卡有8列和1行单元格。在每个单元的内部放置一张卡片的图像。然后我会选择一个单元格来选择一张卡,

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

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

我所尝试的,而且我个人喜欢它的工作方式,就是制作一个
JTable
,每个卡有8列和1行单元格。在每个单元的内部放置一张卡片的图像。然后我会选择一个单元格来选择一张卡,或者在表外使用
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);
DefaultTableModel dtModel=新的DefaultTableModel(列名称,0){
@凌驾
公共类getColumnClass(int列){
如果(getRowCount()>0)
返回getValueAt(0,列).getClass();
返回super.getColumnClass(column);
}
};
//将列添加到模型中:
if(dtModel.getColumnCount()==0){
for(int i=0;i
其中
“C:\\Users\\DeRipper\\Pictures\\Naipes\\oros_1s.jpg”
是卡文件的路径。我首先测试我的代码,为所有的单元格放置相同的卡片图像

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

然后图像就不会再出现在桌子上了。我只需要用户能够点击图像,而不是消失

谢谢你的阅读

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

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

但是,当单击它们几次时,表将停止渲染它们,而是显示图像的“toString()”值:

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

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

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

但是,当单击它们几次时,表将停止渲染它们,而是显示图像的“toString()”值:

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

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