Как установить изображение в ячейке Jtable с помощью рендерера - PullRequest
2 голосов
/ 10 февраля 2012

Я использую следующий код для отображения изображения в ячейке JTable. У меня есть два вопроса для добавления изображения в ячейку jtable.

1.Если я щелкаю по первой строке таблицы, в этой строке будет отображаться изображение «Pointer.gif». Когда я щелкаю по второй строке, изображение «pointer .gif» будет отображаться во второй строке, первой строка получает "Blank.Gif". Затем я нажимаю третью строку, в которой Pointer.gif будет отображаться в третьей строке, вторая строка получает "blank.gif" из первой строки. За это время первая строка будет пустой ( это означает, что первая строка не получила pointer.gif и blank.gif). как это сделать?

2.Второй вопрос: если я выберу первую строку, то pointer.gif будет отображаться в первой строке. Когда я щелкаю по второй строке, указатель.gif будет перемещать вторую строку, первая строка становится пустой. Как это сделать это?

Моя проблема в том, что когда я использую следующий код, "blank.gif" будет отображаться во всем столбце. Когда я нажимаю на конкретную строку, "pointer.gif" будет отображаться в этом месте.

    class FRM_FLXD_ICON_ASSGN extends DefaultTableCellRenderer {
           ImageIcon Icon;
       public Component getTableCellRendererComponent(
          JTable table, Object value, boolean selected, boolean focus,
          int row, int col) {
           if(selected == true){
               Icon=new ImageIcon(getClass().getResource("pointer.gif"));
           }
      else{
          Icon=new ImageIcon(getClass().getResource("blank.jpg"));
       }
           this.setIcon(Icon);
           return this;
         }

    }
    call this class like,

    table1.getColumnModel().getColumn(0).setCellRenderer(new FRM_FLXD_ICON_ASSGN());

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

Я думаю, что загрузка изображений каждый раз при визуализации ячейки не рекомендуется и занимает много оперативной памяти. Аутсорсинг этого кода. Если вы упакуете свои изображения в .jar, то getResource () прав.

Я бы подумал об этом так.

ImageIcon pointer = new ImageIcon(getClass.getResource("pointer.jpg")));
ImageIcon blank = new ImageIcon(getClass.getResource("blank.jpg")));

class FRM_FLXD_ICON_ASSGN extends DefaultTableCellRenderer {
       JLabel jLabel;
   public Component getTableCellRendererComponent(
      JTable table, Object value, boolean selected, boolean focus, int row, int col) {
       if(selected == true){
           jLabel.setIcon(pointer);
       }
  else{
      jLabel.setIcon();
   }
       return jLabel;
     }
}

редактирование:

может быть, это должно быть что-то более подобное

ImageIcon pointer = new ImageIcon(getClass.getResource("pointer.jpg")));
ImageIcon blank = new ImageIcon(getClass.getResource("blank.jpg")));

class FRM_FLXD_ICON_ASSGN extends DefaultTableCellRenderer {
       JLabel jLabel;
   public Component getTableCellRendererComponent(
      JTable table, Object value, boolean selected, boolean focus, int row, int col) {
       if(table.isColumnSelected(column)){
           jLabel.setIcon(pointer);
       }else{
           jLabel.setIcon(blank);
       }
       return jLabel;
     }
}

и в вашей таблице вы должны прикрепить его к столбцу, для которого вы хотите отобразить только указатель.

table.getColumnModel().getColumn(1).setCellRenderer(new YourRenderer());
2 голосов
/ 10 февраля 2012

Renderer возвращает

JTable table, Object value, boolean selected, boolean focus, int row, int col

каждое из этих значений может быть проверяемым, большинство из них настраиваемые (требуется хорошее знание Java ...), что означает, что вы можете тестировать для

  • Object instanceOf Whatever

  • selected

  • focus

  • JTable's row & col

действительно время посмотреть на prepareRenderer

2 голосов
/ 10 февраля 2012

в вашем рендерере getTableCellRendererComponent вернет jLabel со значком.

class FRM_FLXD_ICON_ASSGN extends DefaultTableCellRenderer {
           JLabel jLabel;
       public Component getTableCellRendererComponent(
          JTable table, Object value, boolean selected, boolean focus, int row, int col) {
           jLabel = new JLabel();
           if(selected == true){
               jLabel.setIcon(new ImageIcon(ImageIO.read(new File("C://pointer.jpg"))));
           }
      else{
          jLabel.setIcon(new ImageIcon(ImageIO.read(new File("C://blank.jpg"))));
       }
           return jLabel;
         }
    }
...