2017-02-14 17 views
-3

我想知道是否有人可以提供一个JTable的简单示例,它在单元格中显示Icon和String值。有没有人有JTable的示例代码,显示图标和字符串一起在同一列?

我可以构建一个只有Icon或String的列,但不能同时在一个单元格中。

希望任何人都可以给我在这里的......样品,

我的代码连接, 我通常使代码更简单之前我张贴的问题,但不知道如何解决它这一次......原谅我我连接

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); 

    } 
} 

这些代码是从网上捕捉... 我想了解如何通过研究这种渲染作品.. 但在渲染器类中发生错误..

+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); 
相关问题