概要

垂直JProgressBarの文字列をJLayerを使って横組で表示します。

サンプルコード

final JLabel label = new JLabel("000/100");
label.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
LayerUI<JProgressBar> layerUI = new LayerUI<JProgressBar>() {
  private final JPanel rubberStamp = new JPanel();
  @Override public void paint(Graphics g, JComponent c) {
    super.paint(g, c);
    Dimension d = label.getPreferredSize();
    int x = (c.getWidth() - d.width)  / 2;
    int y = (c.getHeight() - d.height) / 2;
    JLayer jlayer = (JLayer) c;
    JProgressBar progress = (JProgressBar) jlayer.getView();
    int iv = (int) (100 * progress.getPercentComplete());
    label.setText(String.format("%03d/100", iv));
    // label.setText(progress.getString());
    SwingUtilities.paintComponent(
      g, label, rubberStamp, x, y, d.width, d.height);
  }
};
JProgressBar progressBar = new JProgressBar(model) {
  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    Insets i = label.getInsets();
    d.width = label.getPreferredSize().width + i.left + i.right;
    return d;
  }
};
progressBar.setOrientation(SwingConstants.VERTICAL);
progressBar.setStringPainted(false);
JComponent c = new JLayer<JProgressBar>(progressBar, layerUI);
View in GitHub: Java, Kotlin

解説

  • 1番左
    • デフォルトの垂直JProgressBar
  • 左から2番目
    • 文字列表示有りの垂直JProgressBar
  • 右から2番目
  • 1番右
    • JLayerを使用して垂直JProgressBar上に文字列を描画
    • JLabelの幅と任意の余白から垂直JProgressBarの幅を決定するよう、JProgressBar#getPreferredSize()をオーバーライド


  • 一部のOpenJDK 8環境でデフォルト垂直JProgressBarの進捗文字列が90°回転しなくなった?

参考リンク

コメント