2014-02-11 60 views
1

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

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

不是传递进展值的JProgressBar直接,让酒吧从任何进程更新列表中的数据模型的变化。 SwingWorker,见here,对此尤其方便,因为工作人员的setProgress()会自动通知监听者。

+0

问题是''JProgressBar'在'ListCellRenderer'中 – icook

+1

你的'ListModel'应该包含'List ',其中'DownloadWorker'扩展'SwingWorker'。 – trashgod

+0

您可能会误解我的问题,关键是要在运行时更改'JProgressBar'的值。并发现在不是我的关键点。JProgressBar在Renderer中,但我不知道如何更改值JProgressBar在'JList Renderer'中 – icook