【问题标题】:Refresh JTable after look and feel update外观更新后刷新 JTable
【发布时间】:2012-02-22 06:07:16
【问题描述】:

我有一个带有自定义 TableCellRenderer 的 JTable。

public class DateCellRenderer extends DefaultTableCellRenderer {

    private static final long serialVersionUID = 58L;

    public DateCellRenderer() {
        super();
        setHorizontalAlignment(CENTER);     
        setOpaque(true);
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {         
        if (value instanceof Date) {
            String date = new SimpleDateFormat("dd-MM-yyyy").format((Date) value);
            setText(date);
        }
        return this;
    }
}

此外,在我的应用程序中,我有一个下拉菜单,我可以通过它更改外观。此下拉菜单位于父框架中,表位于对话框中。当对话框打开时,父框架是不可访问的。所以要改变外观,我必须先关闭对话框。

现在在特定的皮肤中,如果表格中填充了一些数据,并且我从父框架更改外观并再次打开对话框,那么我添加了 TableCellRenderer 的列将保持旧外观。当其他列以新的外观呈现自己时,它不会更新。

我无法找到问题及其解决方案。任何帮助都是可观的。

注意:应用程序的外观更新由以下sn-p进行

javax.swing.UIManager.setLookAndFeel(uiProperties.getThemeModel().getThemeClass());
ComponentFactory.getLibraryFrame().getRootPane().updateUI();
for (int i = 0; i < Frame.getWindows().length; i++) {
    SwingUtilities.updateComponentTreeUI(Frame.getWindows()[i]);
}
for (int i = 0; i < Frame.getFrames().length; i++) {
    SwingUtilities.updateComponentTreeUI(Frame.getFrames()[i]);
}

提前致谢。

在首先选择的 HiFi 主题中:

然后我把主题改成Fast,第二列“Released”没有更新它的ui:

JTable 是:

public class MovieSearchResultTable extends BaseTable {

    private static final long serialVersionUID = 45L;

    public MovieSearchResultTable(TableModel tableModel) {
        super(tableModel);
        LibraryLogger.initMessage(getClass().getSimpleName());
    }

    @Override
    public void initialize() {
        setFillsViewportHeight(true);
        setAutoResizeMode(AUTO_RESIZE_OFF);
        getColumnModel().getColumn(1).setCellRenderer(new DateCellRenderer());//if I comment out this line then no problem. but without CellRenderer how could I format a Date, if I use formatted String instead of Date, then the column will not sort!!
    }

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return getPreferredSize().getWidth() < getParent().getWidth();
    }
}

【问题讨论】:

  • 外观和感觉
  • 我正在使用 jtatoo - jtattoo.net 外观。它的外观和感觉像 HiFi、Fast、Acryl、Aero 等。该下拉列表包含这些主题列表。
  • 现在你的问题很清楚,但是没有代码产生一些问题.....或者图片是你的问题很难回答,你只是尝试改变JTatoo○s主题,没有别的吗? ??

标签: java swing jtable


【解决方案1】:

我认为 L&F 不太好,JTable 看起来像......好吧,但其他复合 JComponents 不是......,不确定我没有浪费我的时间,我离开去测试一下,也许有什么东西在他们的论坛或文档或 BugParades 上对此进行了描述,但您的问题中没有任何内容

有一个非常简单的方法,你可以随时检查

1) 转至Insubstantial

2) 下载代码源,

3) 将所有类导入 IDE(2-15 分钟取决于 PC 硬件)

4) 搜索文件夹test,有Check.java,

5) 运行它并尝试 JMenu Look and Feel 中的所有内容,在此之前需要为每个 Custom Java Swing Look and Feels 下载 API

【讨论】:

  • 我已经下载了 Insubstantial-insubstantial-insubstantial_7.0-21-gefb2aaf 但找不到 Check.java。 :(
  • 我花了两个半星期来接我最喜欢的L&F(原版失眠)
  • mKorbel 恐怕用了 Substance 观感后问题依旧存在。
  • @Tapas Bose 我确定 L&F 更改的容器和程序没问题,测试了 nTimes,我用它来测试我自己的类(内容),这个窗口总是告诉我真相,那里一定是另一个问题,
【解决方案2】:

解决办法,需要覆盖public Component prepareRenderer(TableCellRenderer renderer, int row, int column)

这是课程:

public class MovieSearchResultTable extends BaseTable {

    private static final long serialVersionUID = 45L;

    private int rolloverRowIndex = -1;

    public MovieSearchResultTable(TableModel tableModel) {
        super(tableModel);
        LibraryLogger.initMessage(getClass().getSimpleName());
    }   

    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component component = super.prepareRenderer(renderer, row, column);
        Color foreground = getForeground();
        Color background = getBackground();
        if (isRowSelected(row)) {
            foreground = getSelectionForeground();
            background = getSelectionBackground();
        }
        else if (row == rolloverRowIndex) {
            foreground = getSelectionForeground();
            background = ColorHelper.brighter(getSelectionBackground(), 40);
        }
        else if (row % 2 == 0) {
            background = ColorHelper.brighter(getParent().getBackground(), 20);
        }
        component.setForeground(foreground);
        component.setBackground(background);
        return component;
    }

    private class RolloverListener extends MouseInputAdapter {

        public void mouseExited(MouseEvent e) {
            rolloverRowIndex = -1;
            repaint();
        }

        public void mouseMoved(MouseEvent e) {
            int row = rowAtPoint(e.getPoint());
            if (row != rolloverRowIndex) {
                rolloverRowIndex = row;
                repaint();
            }
        }
    }

    @Override
    public void initialize() {
        setFillsViewportHeight(true);
        setAutoResizeMode(AUTO_RESIZE_OFF);
        TableColumnModel tableColumnModel = getColumnModel();
        for(ComponentConstant.ColumnName columnName : ComponentConstant.Column.MOVIE_SEARCH_RESULT_TABLE) {
            int order = columnName.getOrder();
            TableColumn tableColumn = tableColumnModel.getColumn(order); 
            if(order == 0) {
                continue;
            }

            tableColumn.setCellRenderer(RendererFactory.getMovieSearchResultTableCellRenderer());
        }
        RolloverListener listener = new RolloverListener();
        addMouseMotionListener(listener);
        addMouseListener(listener);
    }

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return getPreferredSize().getWidth() < getParent().getWidth();
    }
}

谢谢。

【讨论】:

  • 我觉得太复杂了,请排除prepareRenderer +1,是JTable,TableModel如何工作的另一个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2014-03-06
  • 2014-08-11
  • 2014-09-06
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多