2017-03-17 4 views
0

Assez simple, j'ai essayé de suivre d'autres questions ici sur la façon de modifier le JTable pour prendre un imageIcon. J'ai une image dans mon paquet appelé successIcon.png.Pourquoi mon JTable ne me laisse-t-il pas insérer un ImageIcon?

C'est le code pour mon JTable, la plupart du temps généré automatiquement par Net Beans:

statusTable = new javax.swing.JTable(); 

statusTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] { 

}, 
new String [] { 
    "Icons", "Message" 
} 
) { 
Class[] types = new Class [] { 
    javax.swing.ImageIcon.class, java.lang.String.class 
}; 
boolean[] canEdit = new boolean [] { 
    false, false 
}; 

public Class getColumnClass(int columnIndex) { 
    return types [columnIndex]; 
} 

public boolean isCellEditable(int rowIndex, int columnIndex) { 
    return canEdit [columnIndex]; 
} 
}); 

Un de mes boutons utilise une commande statique d'un autre fichier .java:

DBCommands.executeCommand(sqlArea.getSelectedText(), (DefaultTableModel) statusTable.getModel(), selectArea); 

C'est la signature de méthode pour la méthode appelée. Cette commande est appelée bien, je suis compris juste au cas où:

public static void executeCommand(String command, DefaultTableModel model, 
     JTextArea selectArea){ 

Cette commande passe dans une méthode appelée printStatus qui est censé mettre à jour le JTable, mais il ne fonctionne pas. Dans un premier temps sous l'icône, elle écrirait « successIcon.png », mais avec mon code actuel, il ne met rien là du tout:

public static void printStatus(String message, String command, PrintWriter statFileWriter, DefaultTableModel model){ 

    Object[] row = new Object[2]; // so I can add row to table 

    ImageIcon icon = new ImageIcon("successIcon.png"); 

    row[0] = icon; 
    row[1] = message + " (" + command + ")" + "\n"; 
    model.addRow(row); 
    } 
+0

Avez-vous essayé l'exemple par défaut? http://www.java2s.com/Tutorial/Java/0240__Swing/InsertarowtoatablethroughDefaultTableModelatspecifiedrow.htm – ImAtWar

+0

Je ne comprends pas en quoi cela serait différent de ce que j'essaie. L'exemple utilise la méthode insertRow() au lieu de addRow(), ce qui serait difficile à implémenter car je dois ajouter. De plus, ils ont simplement ajouté un tableau Object, ce que j'essaie d'ajouter, sauf que le mien a un ImageIcon qui n'apparaîtra pas – Johnny

+1

L'image est-elle chargée? Essayez de l'ajouter à une étiquette et d'ajouter l'écran comme test – MadProgrammer

Répondre

2

Alors, mon rapide un essai méchant ... fonctionne

Working Images

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private final JTable statusTable; 

     public TestPane() { 
      statusTable = new javax.swing.JTable(); 
      statusTable.setRowHeight(200); 

      statusTable.setModel(new javax.swing.table.DefaultTableModel(
        new Object[][]{}, 
        new String[]{ 
         "Icons", "Message" 
        } 
      ) { 
       Class[] types = new Class[]{ 
        javax.swing.ImageIcon.class, java.lang.String.class 
       }; 
       boolean[] canEdit = new boolean[]{ 
        false, false 
       }; 

       public Class getColumnClass(int columnIndex) { 
        return types[columnIndex]; 
       } 

       public boolean isCellEditable(int rowIndex, int columnIndex) { 
        return canEdit[columnIndex]; 
       } 
      }); 
      setLayout(new BorderLayout()); 
      add(new JScrollPane(statusTable)); 

      JButton add = new JButton("Add"); 
      add(add, BorderLayout.SOUTH); 
      add.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        DefaultTableModel model = (DefaultTableModel) statusTable.getModel(); 
        Object[] row = new Object[2]; // so I can add row to table 

        ImageIcon icon = new ImageIcon("successIcon.jpg"); 

        row[0] = icon; 
        row[1] = "Boo"; 
        model.addRow(row); 
       } 
      }); 
     } 

    } 

} 

Cavets

  • successIcon.jpg doit être dans le même répertoire que le programme est exécuté à partir (AKA le répertoire de travail)

Conclusions

  • L'image est pas chargée. C'est probablement parce que là où vous pensez que l'image est, n'est pas où c'est. Je préfère utiliser ImageIO.read pour charger les images car il ne reviendra pas tant que l'image ne sera pas complètement chargée et il lèvera une exception si l'image est introuvable
  • Vous devez utiliser des ressources intégrées au lieu de charger la ressource à partir du disque. Je recommanderais cela parce que le contexte de "travail" du programme peut changer et n'est pas toujours le même endroit que le programme est installé
  • La référence du JTable votre passage n'est pas la même référence sur l'écran. Pensez à fournir un runnable example qui démontre votre problème. Ce n'est pas un vidage de code, mais un exemple de ce que vous faites qui met en évidence le problème que vous rencontrez. Cela entraînera moins de confusion et de meilleures réponses
+0

Merci pour votre réponse très détaillée. J'avais le .png est dans le src pour mon programme dans NetBeans, et il a trouvé certains d'entre eux correctement que j'utilisais certains d'entre eux pour les icônes de bouton, donc je pensais que c'était bien. Cependant, j'ai déplacé le successIcon.png dans le répertoire parent et maintenant ça marche! J'ai également édité pour passer dans le JTable lui-même et seulement le jeter à un DefaultTableModel à la fin qui semble être une meilleure pratique. – Johnny

+0

Ainsi, lorsque les images sont dans le répertoire 'src' (intégré), vous devez utiliser' Class # getResource' pour obtenir une référence à – MadProgrammer