概要

JProgressBarの進捗文字列をJLabelにして、字揃えなどを変更します。

サンプルコード

class StringAlignmentProgressBar extends JProgressBar {
  private final JLabel label;
  // private transient ChangeListener changeListener;

  protected StringAlignmentProgressBar(BoundedRangeModel model, int horizAlignment) {
    super(model);
    label = new JLabel(" ", horizAlignment);
  }

  @Override public void updateUI() {
    removeAll();
    // removeChangeListener(changeListener);
    super.updateUI();
    setLayout(new BorderLayout());
    // changeListener = e -> label.setText(getString());
    // addChangeListener(changeListener);
    EventQueue.invokeLater(() -> {
      add(label);
      label.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
    });
  }

  @Override protected ChangeListener createChangeListener() {
    return e -> label.setText(getString());
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JProgressBarのレイアウトをBorderLayoutに変更し、水平方向の配置方法を設定したJLabelを追加して字揃えを変更しています。

  • JProgressBar#setStringPainted(true)を同時に使用すると2重に表示される
  • 進捗状況に応じた文字色の変化には対応していない
  • NimbusLookAndFeelを適用したJProgressBarTitledBorderを設定するとデフォルトのJProgressBar#setStringPainted(true)で表示される進捗文字列の垂直位置がずれる場合がある

参考リンク

コメント