2017-03-17 15 views
0

かなり簡単ですが、私はimageIconを取得するためにJTableを変更する方法について、ここでいくつかの質問を続けました。私はsuccessIcon.pngというパッケージにイメージを持っています。JTableでImageIconを挿入できないのはなぜですか?

これは私のJTableのためのコード、主にネットビーンズによって自動生成されます。私のボタンの

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コマンドを使用しています。

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

これは、メソッドが呼び出すメソッドのシグニチャー。 JTableのを更新することになっているprintStatus呼び出されるメソッドに渡し、コマンド

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

、それが動作していない:このコマンドは、私は念のためにそれを含めてよ、罰金と呼ばれています。 ...

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

私はそれが私が試みているものとどのように違うのか分かりません。この例では、addRow()の代わりにinsertRow()メソッドを使用しています。追加する必要があるため、既に実装するのは難しいでしょう。さらに、Object配列を追加しました。これは、私が追加しようとしているものですが、私には表示されないImageIconがあります。 – Johnny

+1

イメージが読み込まれますか?それをラベルに追加し、テストとして画面に追加してみてください。 – MadProgrammer

答えて

2

をだから、私の迅速な厄介なテスト作品:最初のアイコンの下で、それは「successIcon.png」を印刷しますが、私の現在のコードでそれがすべてであり、何も入れていません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を使用することをお勧めします。イメージが完全にロードされ、イメージが見つからない場合には例外がスローされます。
  • ディスクからリソースを読み込む代わりに埋め込みリソースを使用する必要があります。私はこれをお勧めしたいと思います。なぜなら、プログラムの "働く"文脈は変わる可能性があり、プログラムがインストールされている場所と必ずしも同じ場所ではないからです。あなたの問題を示すrunnable exampleを提供することを検討してください。これはコードダンプではありませんが、あなたがしていることの例はあなたが持っている問題を強調表示します。これにより混乱が少なくなり、応答が改善されます
+0

ご連絡ありがとうございます。私は持っていた。pngはNetBeansのプログラム用のsrcにあり、ボタンアイコンにそれらのいくつかを使用していたので、それらのいくつかを適切に見つけ出していたので、うまくいきました。しかし、私はsuccessIcon.pngを親ディレクトリに移動しました。私はまた、JTable自体を渡すように編集し、最後にDefaultTableModelにキャストするだけです。これはより良い方法のようです。 – Johnny

+0

イメージが 'src'ディレクトリ(埋め込み)にあるとき、それらのリファレンスを取得するには' Class#getResource'を使う必要があります – MadProgrammer

関連する問題