簡體   English   中英

JTable Image Render正在應用程序中承擔過多的負載

[英]JTable Image render is Taking too much load In Application

我正在使用Swing的Java應用程序,正在獲取數據,正在使用Swing Jtable Render渲染圖像,但是當數據更多時候一直掛着時,我該怎么做才能防止這種情況發生?

我正在使用的示例渲染。

public class DefaultTableCellRenderer extends javax.swing.table.DefaultTableCellRenderer {

    JLabel jLabel;

    public DefaultTableCellRenderer() {
        jLabel = new JLabel();

    }

    public Component getTableCellRendererComponent(
            JTable table, Object value, boolean selected, boolean focus, int row, int col) {

        try {
            if (row == 1) {
                jLabel.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("blank.png"))));
                jLabel.setText("Image Data");
                jLabel.setBackground(Color.LIGHT_GRAY);
            } else {
                jLabel.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("blank.png"))));
                jLabel.setText("Final");
            }

            //jLabel.setIcon(new ImageIcon(ImageIO.read(new File("blank"))));

            return jLabel;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return jLabel;
    }

    @Override
    public boolean mouseEnter(Event evt, int x, int y) {
        System.out.println(jLabel.getText());
        return true;
    }
}

這個...

jLabel.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("blank.png"))));

這是一個昂貴的調用,每次調用時,都會創建一個新的ImageIcon類,該類將讀取的BufferedImage數據包裹起來。 ImageIcon不同, ImageIO不會緩沖圖像並重新使用它們,而是會重新讀取資源。

這意味着,每次渲染單元時,圖像都會被完全重新加載。

因為每次都加載相同的圖像,所以在構造類時簡單地加載圖像,並在需要時使用它,例如...

public class DefaultTableCellRenderer extends javax.swing.table.DefaultTableCellRenderer {

    private Icon icon;

    public DefaultTableCellRenderer() throws IOException {
        icon = new ImageIcon(ImageIO.read(getClass().getResource("blank.png");
    }

    public Component getTableCellRendererComponent(
            JTable table, Object value, boolean selected, boolean focus, int row, int col) {
        super.getTableCellRendererComponent(table, value, selected, focus, row, col);
        setIcon(icon);
        if (row == 1) {
            setText("Image Data");
            setBackground(Color.LIGHT_GRAY); // You may need to set the opaque state for this to work...
        } else {
            setText("Final");
        }
        return this;
    }
}

給您一些建議:

  1. 您可以使用多線程在應用程序啟動時加載圖像。 使用類執行器來執行此操作。 重要的是:在顯示UI之前,必須加載所有圖像。
  2. 另一種可能性是圖像的異步加載。 使用SwingWorker加載圖像。 加載必須在doInBackground()方法中實現。 加載某些圖像后,可以使用publish() / process()方法使用新圖像更新表模型。
  3. 您可以將兩者結合使用,並在doInBackground()方法中使用Executors doInBackground()

我認為,您的問題不是CPU負載。 您的問題是IO。 從硬盤讀取速度很慢,應盡可能在后台讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM