Tob*_*ann 5 java swing jlist jprogressbar listcellrenderer
我创建了自己的CellRenderer,其中包含几个字符串和一个JList项中的JProgressBar ...但是JProgressBar等整个JList项目将绘制一次,我正在寻找一种方法来重新绘制Items ...我试过了开始一个线程,这将永久重绘......但我不知道我需要重新绘制以获得结果...
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很容易。
public void updateListData(final JList myList) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ListModel lm = myList.getModel();
DefaultListModel dlm = new DefaultListModel();
for (int i = 0; i < lm.getSize(); i++) {
dlm.addElement(lm.getElementAt(i));
}
myList.setModel(dlm);
}
});
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以从 EDT 和另一个线程调用。但您还应该阅读如何处理 Swing 组件并了解模型(ListModel、TableModel 等)。要要求 JList 中的元素重新绘制,您应该修改模型中的对象。