阻止EDT的代码问题

时间:2015-03-12 03:08:52

标签: java multithreading swing jtable event-dispatch-thread

我有一个JTable。在其中,我重写prepareRenderer函数。我描述了我的应用程序,并得到了以下结果:

(对不起,这可能是小阅读)。这是第一线。关键是,我在该功能上花费了大量时间,并且它阻止了我的UI。通过条形图可以看到比整个应用程序的任何其他功能更多的时间。我不太确定如何将我的代码从EDT中删除。

它真正做的就是确定要绘制组件的颜色。我不认为这是耗时的。这让我相信它被调用的次数。我可能错了。

我知道SwingWorker,但我的问题围绕着这样一个事实,即我对他们的印象很大,这个功能的大部分应该在EDT上。

有人可以协助我让这个功能停止阻止吗?

public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
    Component returnComp = super.prepareRenderer(renderer, row, column);
    Color alternateColor = ColorRepository.Table.ALTERNATE_ROW_COLOR;
    Color lightGray = ColorRepository.Table.ROW_COLOR;
    if (!returnComp.getBackground().equals(getSelectionBackground())) {
        if (columnColors.containsKey(column) && requiredColumn.containsKey(column) == false) {
            returnComp.setBackground(columnColors.get(column));
        } else if (requiredColumn.containsKey(column) && getValueAt(row, column) == null) {
            returnComp.setBackground(requiredColumn.get(column));
        } else if (shouldModifyColumn.containsKey(column) && getValueAt(row, column).equals(shouldModifyColumn.get(column))) {
            returnComp.setBackground(shouldModifyColumnColor.get(column));
        } else {
            Color bg = (row % 2 == 0 ? alternateColor : lightGray);
            returnComp.setBackground(bg);
        }
    }

    if (!returnComp.getForeground().equals(getSelectionForeground())) {
        if (canModifyColumnColors.containsKey(column) && returnComp instanceof DefaultTableCellRenderer) {
            returnComp.setForeground(canModifyColumnColors.get(column));
        } else {
            returnComp.setForeground(Color.BLACK);
        }
    }

    if (moneyColumn.containsKey(column) && returnComp instanceof DefaultTableCellRenderer) {
        DefaultTableCellRenderer cellRenderer = (DefaultTableCellRenderer) renderer;
        cellRenderer.setText(Formatter.setDigitsOfPerceision(cellRenderer.getText(), moneyColumn.get(column)));
    }

    if (percentColumn.containsKey(column) && returnComp instanceof DefaultTableCellRenderer) {
        DefaultTableCellRenderer cellRenderer = (DefaultTableCellRenderer) renderer;
        cellRenderer.setText(Formatter.setDigitsOfPerceision(cellRenderer.getText(), percentColumn.get(column)));
    }

    if (toolTip.containsKey(column) && returnComp instanceof JComponent) {
        ((JComponent) returnComp).setToolTipText(toolTip.get(column));
    }

    return returnComp;
}

0 个答案:

没有答案