java - CellRenderer 项目重绘

标签 java swing jlist jprogressbar listcellrenderer

我创建了自己的 CellRenderer,它在 JList 项中包含一些字符串和一个 JProgressBar ...但是 JProgressBar 和整个 JList 项将绘制一次,我正在寻找一种重新绘制项的方法.. .我试图启动一个线程,它将永久重绘......但我不知道我必须重绘什么才能得到结果......

JList 重绘 ... 无结果 CellRenderer 重绘 ... 没有结果 JFrame 重绘 ... 无结果

有没有人理解我的问题并知道出路?

非常感谢!

更新:[更新已删除]

下一次更新:

import java.awt.Component;
import java.awt.Dimension;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.ListCellRenderer;


public class Main extends JFrame{

public DefaultListModel contentListModel = new DefaultListModel();
public MyCellRenderer MCR = new MyCellRenderer();
public JList contentList = new JList(contentListModel);

public Main(){
    super("Example");
    setMinimumSize(new Dimension(300,300));
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    contentList.setCellRenderer(MCR);
    contentListModel.addElement("");
    contentListModel.addElement("");
    add(contentList);
}

public static void main(String[] args){
    new Main().setVisible(true);
}

class MyCellRenderer extends JPanel implements ListCellRenderer{

    public MyCellRenderer(){
        JProgressBar jpb = new JProgressBar();
        jpb.setIndeterminate(true);
        add(jpb);
    }

    @Override
    public Component getListCellRendererComponent(JList arg0, Object arg1,
            int arg2, boolean arg3, boolean arg4) {
        // TODO Auto-generated method stub
        return this;
    }



}

}

最佳答案

如前所述,渲染器不是 Activity 组件,它不是组件层次结构的一部分。因此,“自然”动画效果(如 f.i. 不确定进度条的移动)将丢失。一个可能有用的技巧 - 但要注意:这高度依赖于 LAF! - 是对系统撒谎并报告酒吧始终是可支付的。结合每 x 毫秒伪造一个新值的计时器可能会再次显示动画:

public static class ProgressBarRenderer implements TableCellRenderer {

    /** The bar. */
    private JProgressBar indeterminate = new JProgressBar() {
        // fake displayable to trigger ui animation
        @Override
        public boolean isDisplayable() {
            return true;
        };
    };

    /** The bar. */
    private JProgressBar determinate = new JProgressBar() ;

    public ProgressBarRenderer() {
        indeterminate.setStringPainted(true);
        indeterminate.setIndeterminate(true);
        indeterminate.setString(null);
    }    

    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        int pbi = (Integer) value;
        if (pbi < 0) {
            return indeterminate;
        }
        determinate.setValue(pbi);
        return determinate;
    }
}

// a timer driving the animation
Action update = new AbstractAction() {

    int count;
    @Override
    public void actionPerformed(ActionEvent e) {
        table.setValueAt(-1, 0, AncientSwingTeam.INTEGER_COLUMN);
    }

};
new Timer(100, update).start();

关于java - CellRenderer 项目重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16052980/

相关文章:

javascript - 使用 javascript 从 URL 字符串中删除特定事件

java - 将通用事件传递给 Guava EventBus?

java - 清除jList的选择

java - 包中的基类和派生类

java - Sqoop导入表报错ORA-01843

java - 大括号阻止编译

java - 调整java swing中复选框之间的间距

java - 将多个矩形绘制到 JPanel

java - JList - 以红色突出显示特定单元格

java - Swing 对 JList 的 MVC 实现有问题吗?