簡體   English   中英

切換垂直JScrollBar的最小/最大位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM