java 从右到左(向后)JProgressBar

6qftjkof  于 2022-11-27  发布在  Java
关注(0)|答案(6)|浏览(116)

我的应用程序需要显示一个从-1到1的值的图形表示。负值应该用一种颜色,正值用另一种颜色。零在中间,什么也不显示。(如果有帮助的话,这里的特殊用途是显示金融应用程序中买入和卖出订单的相对权重。)
我最好使用一对JProgressBars来实现这一点,但是Swing控件(最小)从左边开始。标准控件只支持两个方向,即左-右或下-上。传入负值没有帮助。我的问题是,实现这种效果的最快方法是什么?
对JProgressBar进行子类化将涉及到几乎完全重新实现它。对于一个相对琐碎的任务,使用JFreeChart条形图似乎需要大量的代码(和工作)。我也许可以创建一个小的、方单元格的JTable并填充它,但这也需要大量的代码。您有什么建议?

b4lqfgs4

b4lqfgs41#

嗯,也许这根本不起作用,但如何创建JProgressBar的子类并将paintComponent()覆盖为如下内容:

@Override
protected void paintComponent(Graphics g) {
  Graphics2D g2d = (Graphics2D) g;
  g2d.rotate(Math.PI);
  super.paintComponent(g2d);
}

如果我清醒一点我会测试的。
编辑:虽然旋转它也可以工作,但我发现缩放它然后平移它更容易,如下所示:

@Override
protected void paintComponent(Graphics g) {
  Graphics2D g2d = (Graphics2D) g;
  g2d.scale(-1, 1); //Flips over y-axis
  g2d.translate(-getWidth(), 0); //Moves back to old position.
  super.paintComponent(g2d);
}
hujrc8aj

hujrc8aj2#

使用JFreeChart或子类化JProgressBar看起来有些矫枉过正,但是在BasicSliderUI中覆盖paintTrack()可能是有效的。

ep6jt1vc

ep6jt1vc3#

前几天我看了一下JFreeChart,对于你想做的事情,它看起来完全是矫枉过正。
由于这看起来像是很容易按程序绘制,所以我只需要创建一个扩展JComponent的类,覆盖paint方法在其中绘制一个矩形,然后将其添加为一个自定义部件。

tuwxkamq

tuwxkamq4#

下面的代码可以完成这项工作:

setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
icomxhvb

icomxhvb5#

交换背景色和前景色,回归看起来就像是向左前进。

ffx8fchx

ffx8fchx6#

我尝试了上面接受的解决方案,但它没有解决我的用例。我需要进度条是垂直的,进度从顶部到底部,并在进度条中以字符串的形式显示值,在正确的可读方向。如果字符串值不需要显示,旋转进度条也可以工作。:-(
所以,经过大量的研究,我决定如下。
延长

javax.swing.plaf.basic.BasicProgressBarUI

并重写

protected void paintDeterminate(Graphics g, JComponent c)

方法中。
保持一切与父 * 相同,除了 * 在垂直的情况下改变这个小片段。
原始版本

g2.drawLine(barRectWidth/2 + b.left,
            b.top + barRectHeight,
            barRectWidth/2 + b.left,
            b.top + barRectHeight - amountFull);

已修改

g2.drawLine(barRectWidth / 2 + b.left,
                b.top,
                barRectWidth / 2 + b.left,
                b.top + amountFull);

这正好解决了我的用例;从上到下,以一个可读的方向显示字符串值。2也许这篇文章会帮助其他人,或者至少为他们指明一个方向。
祝你好运,丹尼尔

相关问题