2017-02-14 1 views
-3

Ich frage mich, ob jemand ein einfaches Beispiel für JTable anbieten kann, das Icon und String-Wert zusammen in einer Zelle zeigt.Hat jemand Beispielcode von JTable, der Icon und String zusammen in einer Spalte zeigt?

Ich kann eine JTable mit Spalte entweder nur mit Icon oder String, aber nicht beide in einer Zelle zusammen bauen.

Hoffnung jemand mir eine Probe hier geben kann ...

Meine Codes gebunden sind, ich in der Regel Code einfacher machen, bevor ich Frage posten, aber nicht wissen, wie es dieses Mal beheben ... verzeih mir daß ich angebracht

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

    } 
} 

Diese Codes werden von Internet erfaßt ... Ich versuche Werke zu verstehen, wie Render dies durch das Studium .. aber ein Fehler tritt bei der Klasse Renderer ..

+2

Bitte zeigen Sie uns Ihren besten [mcve] Code. Wenn Sie dies noch nicht getan haben, sollten Sie sich die Erstellung eines eigenen JTable-Zellen-Renderers ansehen (obwohl ich annehmen würde, dass Ihre Forschung Sie bereits in diese Richtung geführt hätte). –

+0

Entschuldigung, dass ich gerade eine Probe gefragt habe .... jetzt habe ich die Codes angehängt, an denen ich gearbeitet habe. –

+0

Es sieht so aus: http://stackoverflow.com/a/10785292/1140748 –

Antwort

0

Ich fand heraus, wie es funktioniert.

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

Diese Zeile musste mit der folgenden Zeile gehen.

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

Auch jemand, der die JLabel um es auf alle Komponenten machen will, Die Antwort ist hier How to add icon near arrow icon for JComboBox

Dank.

1

Sie eine JLabel nicht speichern in dem Tablemodel . Ein JLabel belegt zu viele Ressourcen.

Erstellen Sie stattdessen ein benutzerdefiniertes Objekt (z. B. IconTextItem) mit zwei Eigenschaften: 1) Text und 2) Symbol.

dann Ihre benutzerdefinierten Renderer würde in etwa so aussehen:

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

Und Sie fügen Sie den Renderer auf die Tabelle mit Code wie:

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