【问题标题】:Updating JList Components更新 JList 组件
【发布时间】:2014-03-09 08:19:00
【问题描述】:

我在JPanel 上有一个JProgressBar 作为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);
        }
    }
}

【问题讨论】:

    标签: java swing jlist jprogressbar listcellrenderer


    【解决方案1】:

    不要将进度值直接传递给JProgressBar,而是让栏监听来自任何更新列表数据模型的进程的更改。 SwingWorker,见here,为此特别方便,因为worker的setProgress()会自动通知听众。

    【讨论】:

    • 问题是JProgressBarListCellRenderer
    • 您的ListModel 应包含List&lt;DownloadWorker&gt;,其中DownloadWorker 扩展SwingWorker
    • 你可能误会我的问题,关键是在运行时改变JProgressBar的值。并发不是我现在的重点。JProgressBar在Renderer中,但我没有知道如何在 JList Renderer 中更改 JProgressBar 的值
    • JProgressBar 应该监听变化; PropertyChangeListener 对此很方便; SwingWorker 恰好触发了一个合适的PropertyChangeEvent;你可以管理自己的事件,但你迟早要解决并发问题;我会尽快投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2011-10-12
    • 2014-01-12
    • 2016-07-15
    • 2012-10-07
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多