简体   繁体   English

使JProgressBar在JList中可点击

[英]Making JProgressBar clickable in JList

I have a class which extends AbstractListModel and implements PropertyChangeListener, with a list of JProgressBar being hold within. 我有一个扩展AbstractListModel并实现PropertyChangeListener的类,其中包含一个JProgressBar列表。 Upon starting a SwingWorker this class will publish the JprogressBar to show the progress. 启动SwingWorker后,此类将发布JprogressBar以显示进度。

The class work fine in showing the progress, but I would like to modify for user to allow them click on the progress bar and cancel a task, I added mouselistener to the JprogressBar, however the mouselistener are not captured. 该类可以很好地显示进度,但是我想为用户进行修改,以允许他们单击进度栏并取消任务,我在JprogressBar中添加了mouselistener,但是未捕获mouselistener。 Below is my class snippet, can someone advice where goes wrong please? 以下是我的课堂摘要,有人可以建议哪里出问题了吗?

public final class JobManager extends AbstractListModel implements PropertyChangeListener {
    private static final List<JProgressBar> progressBarList = new ArrayList<JProgressBar>();

    private static final JobManager INSTANCE = new JobManager();

    // Called by swing ui to add into Jpanel
    public JScrollPane getJobListPane() {
        final JList jobTable = new JList(INSTANCE);
        jobTable.setName("Job List");
        jobTable.setCellRenderer(new CustomListCellRenderer());
        JScrollPane scrollPane = new JScrollPane(jobTable);
        return new JScrollPane(tasksTable);
    }

    private void startJob(List<Job> jobList) {

        JProgressBar progressBar = new JProgressBar();
        progressBar.setMaximum(100);
        progressBar.setStringPainted(true);
        progressBar.setString(String.format("%s (%d%%)", caption, 0));
        progressBar.setForeground(Colours.GREEN.brighter());
        progressBar.setBackground(Color.GREEN);


        final JPopupMenu popUpMenu = new JPopupMenu();
        JMenuItem cancelMenuItem = new JMenuItem("Cancel");
        cancelMenuItem.addActionListener(new ActionListener() {
          @Override
           public void actionPerformed(final ActionEvent e) {
                 System.out.println("Pressed cancellation option..............");
                 cancelTask();
            }
         });

    popUpMenu.add(cancelMenuItem);

        final JProgressBar progressBar1 = progressBar;

        MouseListener mouseListener = new MouseAdapter() {
             @Override
             public void mouseClicked(final MouseEvent mouseEvent) {
                    popUpMenu.show(mouseEvent.getComponent(), progressBar1.getX(), progressBar1.getY());
             }
        };
        progressBar.addMouseListener(mouseListener);

        JobManager.progressBarList.add(progressBar);

        fireIntervalAdded(this, JobManager.jobList.size() - 1, JobManager.jobList.size() - 1);

        runnable.addPropertyChangeListener(this);

    }

    @Override
    public Object getElementAt(final int row) {
        if (row < JobManager.progressBarList.size()) {
            return JobManager.progressBarList.get(row);
        } else {
            return null;
        }
    }

    @Override
    public int getSize() {
        return someSize;
    }

    @Override
    public void propertyChange(final PropertyChangeEvent evt) {
            int index = jobList.indexOf(evt.getSource());
            if (index >= 0) {
                int progress = (Integer) evt.getNewValue();
                JProgressBar progressBar = JobManager.progressBarList.get(index);
                progressBar.setString(String.format("%s (%d%%)", "Job title ", progress));
                progressBar.setValue(progress);

                fireContentsChanged(this, index, index);
            }
        }
    }
}



public class CustomListCellRenderer implements ListCellRenderer {

    @Override
    public Component getListCellRendererComponent(final JList list, final Object value, final int index,
            final boolean isSelected, final boolean cellHasFocus) {
        if (value instanceof Component) {
            return (Component) value;
        }  
        return new JProgressBar();

    }
}

I added mouselistener to the JprogressBar, however the mouselistener are not captured. 我在JprogressBar中添加了mouselistener,但是没有捕获mouselistener。

The JProgressBar is not a real component. JProgressBar不是真正的组件。 A renderer just paints a picture of the component. 渲染器仅绘制组件的图片。

You need to add a JPopupMenu and MouseListener to the JList . 您需要将JPopupMenuMouseListener添加到JList The MouseListener is required to select the light that is clicked. 必须使用MouseListener来选择被单击的灯光。 Something like: 就像是:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class ListRightClick extends JPanel implements ListSelectionListener
{
    public ListRightClick()
    {
        setLayout( new BorderLayout() );

        final JPopupMenu popup = new JPopupMenu();
        popup.add( new JMenuItem("Do Something1") );
        popup.add( new JMenuItem("Do Something2") );
        popup.add( new JMenuItem("Do Something3") );

        String[] data = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight" };
        JList<String> list = new JList<String>( data );
        list.setVisibleRowCount( 5 );
        list.setComponentPopupMenu( popup );
        list.addListSelectionListener( this );

        list.addMouseListener( new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                if ( SwingUtilities.isRightMouseButton(e) )
                {
                        JList list = (JList)e.getSource();
                        int row = list.locationToIndex(e.getPoint());
                        list.setSelectedIndex(row);
                }
            }

        });

        add( new JScrollPane(list) );
    }

    public void valueChanged(ListSelectionEvent e)
    {
        JList list = (JList)e.getSource();
        System.out.println(list.getSelectedValue());
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("ListRightClick");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new ListRightClick(), BorderLayout.NORTH);
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM