2017-03-17 40 views
0

很簡單,我試着在這裏討論如何修改JTable來獲取imageIcon。我的包中有一個名爲successIcon.png的圖像。爲什麼我的JTable不允許插入ImageIcon?

這是我的JTable中的代碼,通過網絡豆類大多是自動生成的:

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

這就是:

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

我的一個按鈕,從另一個java文件使用static命令它調用的方法的方法簽名。該命令被稱爲細,我包括它以防萬一:

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

該命令將其傳遞到一個名爲printStatus方法,這是應該更新JTable中,但它不工作。起初,在圖標會打印出「successIcon.png」,但我目前的代碼,它不把任何東西存在一樣:

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

你試過默認的例子嗎? http://www.java2s.com/Tutorial/Java/0240__Swing/InsertarowtoatablethroughDefaultTableModelatspecifiedrow.htm – ImAtWar

+0

我不明白這與我所嘗試的不同。該示例使用insertRow()方法而不是addRow(),這對我來說很難實現,因爲我需要追加。此外,他們只是添加了一個Object數組,這正是我想要添加的,除了我的ImageIcon不會顯示出來 – Johnny

+1

圖像是否加載?嘗試將其添加到標籤並將其添加到屏幕中作爲測試 – MadProgrammer

回答

2

所以,我快一個討厭的測試工作...

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必須是在該程序從執行相同的目錄(AKA工作目錄)

結論
  • 圖像沒有被加載。這可能是因爲你認爲圖像在哪裏,而不是它在哪裏。我更願意使用ImageIO.read加載圖像,因爲直到圖像完全加載後它纔會返回,並且如果圖像無法找到,將會拋出異常
  • 您應該使用嵌入式資源,而不是從磁盤加載資源。我推薦這樣做,因爲程序的「工作」上下文可能會改變,並不總是與程序安裝的位置相同
  • JTable您的傳遞參考不是屏幕上的相同參考。考慮提供一個runnable example這表明你的問題。這不是代碼轉儲,而是您正在做的事情的一個例子,它突出了您遇到的問題。這將導致更少的困惑和更好的反應
+0

非常感謝您的詳細回覆。我有。png在我的NetBeans程序的src中,它正在查找其中的一些,因爲我正在使用其中的一些按鈕圖標,所以我認爲這很好。但是,我將successIcon.png移到了父目錄,現在它工作正常!我也編輯過要傳遞JTable本身,並且只在最後纔將它轉換爲DefaultTableModel,這似乎是更好的練習。 – Johnny

+0

因此,當圖像位於src'目錄(嵌入式)時,您需要使用'Class#getResource'獲取對它們的引用 – MadProgrammer