[英]Switch vertical JScrollBar min/max location
我有一個垂直的 JScrollBar
,它的默認行為是在滾動條值達到模型最小值時在頂部顯示拇指。
我想要相反的行為:當值最小時,拇指將在底部 。
我已經嘗試過setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT)
,它適用於水平滾動條,但不適用於垂直滾動條...
如何使它按預期工作(如果可能,則不創建完整的ScrollBarUI
)? 那是預期的行為嗎(水平和垂直滾動條之間的一種“ UI不一致” *,或者缺少ComponentOrientation.BOTTOM_TO_TOP
常量)?
這是說明問題的一些SSCE:
public static void main(String[] args) throws Exception {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int orient = JScrollBar.VERTICAL; // <<--- Change to HORIZONTAL
JScrollBar sb = new JScrollBar(orient, 0, 100, 0, 1000);
sb.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); // <<--- Works only for HORIZONTAL
sb.addAdjustmentListener(new AdjustmentListener() {
@Override public void adjustmentValueChanged(AdjustmentEvent e) {
System.out.println(e.getValue());
}
});
f.add(sb);
if (orient == JScrollBar.HORIZONTAL)
f.setBounds(100, 100, 500, 100);
else
f.setBounds(100, 100, 100, 500);
f.setVisible(true);
}
*:“不一致”,因為如果將拇指反轉為水平方向,我希望拇指也反轉為垂直方向...
編輯:滾動條用於控制地圖中的滾動,該地圖可配置為使其原點位於屏幕的頂部或底部,向下或向上或在左側或右側,向右-或向左(它必須與物理設置匹配,因此可以配置)。 處理左右設置只是將滾動條設置為水平,並具有從右到左的方向,但是對於垂直方向則無效。
我還檢查了BasicScrollBarUI
的源代碼,並且僅當滾動條為HORIZONTAL
時,它才確實處理getComponentOrientation().isLeftToRight()
。 因此,這確實是預期的行為(僅不是我預期的行為)。
最后,我使用完成翻譯的getAdjustedValue()
將JScrollBar
子類化。 想法是“反轉” min和max,因此[min;max]
變為[-max;-min]
。 然后,在調整模型值時必須考慮范圍,因為拇指的底部( value + extent
)是我們想要的值:
public static class MySB extends JScrollBar {
private boolean inv;
public MySB(int orient, int value, int extent, int min, int max, boolean inv) {
super(orient, inv ? -value-extent : value, extent, inv ? -max : min, inv ? -min : max);
this.inv = inv;
}
public int getAdjustedValue() {
int v = super.getValue();
if (inv)
v = -(v + model.getExtent());
return v;
}
}
然后修改上面的SSCE,在AdjustmentListener中添加sb.getAdjustedValue()
:
...
MySB sb = new MySB(orient, 0, 100, 0, 1000, true);
sb.addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
System.out.println(e.getValue()+", "+((MySB)e.getAdjustable()).getMyValue());
}
});
...
-100, 0
-200, 100
-200, 100
-200, 100
-300, 200
-300, 200
我們看到原始值,然后是更正的值。 我最初開始對模型進行子類化,並覆蓋getValue()
但是它弄亂了頁面的上/下和箭頭行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.