2017-03-17 66 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

相关问题