Swing 採用 **MVC 變體**,元件 (View) 與資料 (Model) 分離。JSlider 與 JProgressBar 均使用 BoundedRangeModel,透過 **共享同一模型實例** 即可實現零程式碼同步。
public class Progress extends JPanel {
JProgressBar pb = new JProgressBar();
JSlider sb = new JSlider(JSlider.HORIZONTAL, 0, 100, 60);
public Progress() {
setLayout(new GridLayout(2, 1));
add(pb);
sb.setValue(0);
sb.setPaintTicks(true);
sb.setMajorTickSpacing(20);
sb.setMinorTickSpacing(5);
sb.setBorder(new TitledBorder("Slide Me"));
// 核心一行:共享模型
pb.setModel(sb.getModel());
add(sb);
}
public static void main(String[] args) {
Show.inFrame(new Progress(), 200, 150);
}
}
| 方法 | 說明 |
|---|---|
setPaintTicks(true) | 顯示刻度標記 |
setMajorTickSpacing(20) | 主刻度間距 |
setMinorTickSpacing(5) | 次刻度間距 |
setBorder(new TitledBorder(...)) | 添加帶標題邊框,提升易用性 |
pb.setModel(sb.getModel()) | **核心**:進度條直接使用滑桿模型,雙向同步 |
// 針對特殊需求(如非線性映射、區間限制)可繼承 DefaultBoundedRangeModel
class LogarithmicModel extends DefaultBoundedRangeModel {
@Override public void setValue(int nv) {
// 對數轉換邏輯
super.setValue(transform(nv));
}
}
JSlider + JProgressBar 共享模型是 Swing **「資料驅動 UI」** 哲學的經典展現:一行代碼實現雙向綁定。掌握模型分離思想,能大幅減少事件監聽與手動同步代碼,構建更清晰、可維護的介面邏輯。