2017-02-14 15 views
-3

Интересно, может ли кто-нибудь предложить простой пример JTable, который показывает значение Icon и String вместе в ячейке.Есть ли у кого-нибудь образец кода JTable, который показывает Icon и String вместе в одном столбце?

Я могу построить JTable со столбцом либо только с помощью значка или строки, но не в обеих ячейках вместе.

Надежда кто-нибудь может дать мне образец здесь ...

прикрепляются Мои коды, я обычно делают код более простым, прежде чем я отправляю вопрос, но не знаю, как исправить это на этот раз ... прости меня что я прикрепил

package jtableWithIcon; 

import java.awt.Component; 

import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 

public class Renderer extends DefaultTableCellRenderer{ 

    public void fillColor(JTable t,JLabel l,boolean isSelected){ 
    //setting the background and foreground when JLabel is selected 
     if(isSelected){ 
      l.setBackground(t.getSelectionBackground()); 
      l.setForeground(t.getSelectionForeground()); 
     } 
     else{ 
      l.setBackground(t.getBackground()); 
      l.setForeground(t.getForeground()); 
     } 

    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
                boolean hasFocus, int row, int column){ 
     if(value instanceof JLabel){ 
      ImageIcon imageIcon = new ImageIcon(); 
      JLabel label = (JLabel)value; 
      //you can add the image here 

      label.setIcon(new ImageIcon(getClass().getResource("icon.png"))); 
     //*****NullPointException occurs here in thread "AWT-EventQueue-0".... 
     //********************************************* 

     label.setOpaque(true); 
     fillColor(table,label,isSelected); 

     return label; 
    } 
    else { 
     return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    } 
} 
} 

package jtableWithIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 

public class MainMyTableTest extends JFrame{ 

    public MainMyTableTest(String title){ 
     super(title); 
     showGUI(); 
    } 

    public void showGUI(){ 
     JTable table = new JTable(); 
     table.setModel(new MyModel());//invoking our custom model 
     table.setDefaultRenderer(JLabel.class, new Renderer());// for the rendering of cell 
     JScrollPane jp = new JScrollPane(table); 
     getContentPane().add(jp); 
     setVisible(true); 
     setSize(500,300); 
    } 

    public static void main(String[] args) { 
     MainMyTableTest t = new MainMyTableTest("Table Custom"); 
    } 
} 

package jtableWithIcon; 

import javax.swing.JLabel; 

class MyModel extends javax.swing.table.DefaultTableModel{ 

    Object[][] row = {{new JLabel("Row 1 Col 1"), "Row 1 Col 2", "Row 1 Col3"}, 
         {new JLabel("Row 2 Col 1"), "Row 2 Col 2", "Row 2 Col3"}, 
         {new JLabel("Row 3 Col 1"), "Row 3 Col 2", "Row 3 Col3"}, 
         {new JLabel("Row 4 Col 1"), "Row 4 Col 2", "Row 4 Col3"}}; 

    Object[] col = {"Column 1", "Column 2", "Column 3"}; 

    public MyModel(){ 

    //Adding columns 
     for(Object c: col) 
      this.addColumn(c); 

    //Adding rows 
     for(Object[] r: row) 
      addRow(r); 
    } 

    @Override 
    public Class getColumnClass(int columnIndex) { 
     if(columnIndex == 0) 
      return getValueAt(0, columnIndex).getClass(); 

     else 
      return super.getColumnClass(columnIndex); 

    } 
} 

Эти коды захватываются из Интернета ... Я пытаюсь понять, как Рендер работы по изучению этого .. но возникает ошибка в классе Renderer ..

+2

Пожалуйста, покажите нам ваш лучший [mcve] код. Если вы еще этого не сделали, вы захотите изучить свой собственный рендеринг ячеек JTable (хотя я бы предположил, что ваши исследования уже привели вас в этом направлении). –

+0

жаль, что я просто попросил образец ... теперь я прикрепил коды, над которыми я работал. –

+0

Он выглядит следующим образом: http://stackoverflow.com/a/10785292/1140748 –

ответ

0

Я узнал, как заставить его работать.

label.setIcon(new ImageIcon(getClass().getResource("icon.png"))); 

Эта линия должна была идти с нижеследующей.

label.setIcon(new ImageIcon("icon.png)); 

Кроме того, кто-то, кто хочет оказать JLabel, чтобы поставить его на какие-либо компоненты, Ответ здесь How to add icon near arrow icon for JComboBox

Спасибо.

1

Не храните JLabel в TableModel , JLabel занимает слишком много ресурсов.

Вместо этого создайте пользовательский объект (скажем, IconTextItem) с двумя свойствами: 1) текст и 2) значок.

Затем пользовательский визуализатор будет выглядеть примерно так:

class IconTextRenderer extends DefaultTableCellRenderer 
{ 
    @Override 
    public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     IconTextItem item = (IconTextItem)value; 
     setText(item.getText); 
     setIcon(item.getIcon); 

     return this; 
    } 
} 

И вы добавляете рендер к столу с кодом, как:

table.getColumnModel().getColumn(0).setCellRenderer(new IconTextRenderer);