更新JList组件

时间:2014-02-11 13:48:20

标签: java swing jlist jprogressbar listcellrenderer

我在JProgressBar上有一个JPanel作为JList组件.JList组件应该每两秒更新一次JProgressBar。但问题是,我不是知道如何将进度值传递给JProgressBar。 这是我的代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class download {
    download(){}
}
class myPanelListCellRenderer extends DefaultListCellRenderer{
    private static final long serialVersionUID = 1L;
    private JPanel downloadPanel,labelStack;
    private JProgressBar downloadProgress;
    private JLabel fileTypeIconLabel,fileNameLabel,downloadInfoLabel,freeLabel;
    public myPanelListCellRenderer(){
        setLayout(null);
        downloadPanel=new JPanel(new BorderLayout(10,20));
        labelStack=new JPanel(new GridLayout(0,1,2,2));
        downloadProgress=new JProgressBar() {
            @Override
            public Dimension getPreferredSize() {
                Dimension d = super.getPreferredSize();
                return new Dimension(400,d.height);
            }
        };
        fileTypeIconLabel=new JLabel("test", SwingConstants.CENTER);
        fileNameLabel=new JLabel("fileNameLabel", SwingConstants.CENTER);
        downloadInfoLabel=new JLabel("downloadInfoLabel", SwingConstants.CENTER);
        freeLabel=new JLabel("freeLabel", SwingConstants.CENTER);
        fileTypeIconLabel.setFont(fileTypeIconLabel.getFont().deriveFont(60f));
        labelStack.add(fileNameLabel);
        labelStack.add(downloadInfoLabel);
        labelStack.add(downloadProgress);
        labelStack.add(freeLabel);  
        labelStack.setOpaque(false);
        downloadPanel.add(fileTypeIconLabel,BorderLayout.LINE_START);
        downloadPanel.add(labelStack,BorderLayout.CENTER);
    }
    @Override
    public Component getListCellRendererComponent(JList<?> list,Object value,int index,boolean isSelected,boolean cellHasFocus) {
        JLabel l = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        downloadPanel.setBackground(l.getBackground());
        fileTypeIconLabel.setText("" + (index + 1));
        return downloadPanel;
    }
}

public class JListPanel implements ActionListener{
    private JPanel btnPanel;
    private JButton jbtAdd,jbtDelete;
    private JFrame jf;
    private download dl;
    DefaultListModel<download> myListModel;
    JList<download>myList;
    public JListPanel(){
        myListModel=new DefaultListModel<download>();
        myList=new JList<download>(myListModel);
        myList.setCellRenderer(new myPanelListCellRenderer());
        myList.setVisibleRowCount(8);
        btnPanel=new JPanel();
        jbtAdd=new JButton("addJpanel");
        jbtDelete=new JButton("delJpanel");
        btnPanel.setLayout(new FlowLayout(FlowLayout.LEFT,1,1));
        btnPanel.add(jbtAdd);
        btnPanel.add(jbtDelete);
        jf=new JFrame("hello");
        for(int i=0;i<6;i++){
            dl=new download();
            myListModel.add(0, dl);
        }
        jf.setLocationByPlatform(true);
        jf.add(btnPanel,BorderLayout.NORTH);
        jf.add(new JScrollPane(myList),BorderLayout.CENTER);
        jbtAdd.addActionListener(this);
        jbtDelete.addActionListener(this);
        jf.pack();
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
    public static void main(String args[]){
        new JListPanel();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if(e.getSource()==jbtAdd){
            addMyPanel();
        }
        else if(e.getSource()==jbtDelete){
            delMyPanel();
        }
    }
    public void addMyPanel(){
        myListModel.add(0,new download());
    }
    public void delMyPanel(){
        int index = myList.getSelectedIndex();
        if (index < 0) {
            JOptionPane.showMessageDialog(
                    myList,
                    "Select a download to delete!",
                    "Select Download",
                    JOptionPane.ERROR_MESSAGE);
        } else {
            myListModel.removeElementAt(index);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

不要直接将进度值传递给JProgressBar,而是让栏监听以获取来自任何进程更新列表数据模型的更改。 SwingWorker,见here,对此非常方便,因为工作人员setProgress()会自动通知听众。