2016-01-28 3 views
0

Я пишу программу для игры в карты. Я уже делал игру и эффективно ее воспроизводил, но теперь я решил добавить образы карт (сейчас это работает, но с использованием имен карточек, таких как «As of Spades», вместо значка для их представления).Java - рендеринг изображения в JTable

В моей программе я использую 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); 

Где "C:\\Users\\DeRipper\\Pictures\\Naipes\\oros_1s.jpg" путь к файлу карты. Я сначала тестировал свой код, помещая одно и то же изображение карты для всех ячеек.

На первый взгляд я получил желаемый результат, изображения отображались правильно, но при нажатии на них пару раз таблица будет прекратить предоставление их и вместо этого показал значение toString() изображений:

Card Images in JTable(2)

Card Images in JTable(3)

И то изображения не будет отображаться на столе снова. Мне просто нужно, чтобы пользователь мог нажимать на изображения и не исчезать.

Хорошо, спасибо за чтение.

DeR.

ответ

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

Не добавляйте JLabel s к модели. Вместо этого вам нужно добавить ImageIcon.

Затем JTable будет использовать средство рендеринга значков для отображения изображения.

Simple Example

, но при нажатии на них пару раз таблица будет прекратить предоставление их и вместо того, чтобы показывать на «ToString()» значение образов:

При редактировании ячейки, тогда редактор по умолчанию просто сохранит представление объекта toString() объекта обратно в TableModel. Поэтому вы можете переопределить метод isCellEditable(...), чтобы отключить редактирование. В противном случае вам понадобится специальный редактор, который знает, как редактировать и сохранять ImageIcon.

Смежные вопросы