Swing/ProgressComboBox のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ProgressComboBox へ行く。
- 1 (2011-09-05 (月) 17:17:06)
- 2 (2012-12-18 (火) 19:25:42)
- 3 (2013-09-20 (金) 04:33:03)
- 4 (2014-12-02 (火) 01:34:54)
- 5 (2015-01-04 (日) 07:14:40)
- 6 (2015-03-19 (木) 16:32:46)
- 7 (2017-02-11 (土) 23:21:30)
- 8 (2017-12-27 (水) 18:27:41)
- 9 (2018-02-24 (土) 19:51:30)
- 10 (2019-12-17 (火) 13:57:50)
- 11 (2021-06-19 (土) 17:18:26)
TITLE:JComboBox内にJProgressBarを表示
Posted by aterai at 2011-09-05
JComboBox内にJProgressBarを表示
JComboBox内にJProgressBarを設定して進捗を表示します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
class ProgressCellRenderer extends DefaultListCellRenderer {
private final JProgressBar bar = new JProgressBar();
@Override public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
if(index<0 && worker!=null && !worker.isDone()) {
bar.setFont(list.getFont());
bar.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
bar.setValue(count);
return bar;
}else{
return super.getListCellRendererComponent(
list,value,index,isSelected,cellHasFocus);
}
}
@Override public void updateUI() {
super.updateUI();
if(bar!=null) SwingUtilities.updateComponentTreeUI(bar);
}
}
解説
上記のサンプルでは、indexが負(アイテムリストではない)の場合、JProgressBarを返すセルレンダラーをJComboBoxに設定して進捗を表示しています。
ロードボタンが押されたら、以下のようなSwingWorkerで、JComboBoxにアイテムを追加しています。
button = new JButton(new AbstractAction("load") {
@Override public void actionPerformed(ActionEvent e) {
button.setEnabled(false);
combo.setEnabled(false);
combo.removeAllItems();
worker = new SwingWorker<String, String>() {
private int max = 30;
@Override public String doInBackground() {
int current = 0;
while(current<=max && !isCancelled()) {
try {
Thread.sleep(50);
//setProgress(100 * current / max);
count = 100 * current / max;
publish("test: "+current);
}catch(Exception ie) {
return "Exception";
}
current++;
}
return "Done";
}
@Override protected void process(java.util.List<String> chunks) {
DefaultComboBoxModel m = (DefaultComboBoxModel)combo.getModel();
for(String s: chunks) {
m.addElement(s);
}
combo.setSelectedIndex(-1);
combo.repaint();
}
@Override public void done() {
String text = null;
if(!isCancelled()) {
combo.setSelectedIndex(0);
}
combo.setEnabled(true);
button.setEnabled(true);
count = 0;
}
};
worker.execute();
}
});