У меня есть класс, который расширяет AbstractListModel и реализует PropertyChangeListener со списком JProgressBar, который хранится внутри. После запуска SwingWorker этот класс опубликует JprogressBar, чтобы показать прогресс.
Класс отлично работает, показывая прогресс, но я хотел бы изменить для пользователя, чтобы он мог щелкнуть индикатор выполнения и отменить задачу, я добавил mouselistener в JprogressBar, однако mouselistener не захвачен. Ниже приведен фрагмент моего класса, может кто-нибудь посоветовать, где что-то пойдет не так, пожалуйста?
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();
}
}