2015-10-28 41 views
1

是否有一種簡單的方法來改變JSlider上方標籤中顯示的值,同時使用某些「外觀和感覺」?顯示修改後的JSlider值Thumb

要清楚,我說的是這個值:

enter image description here

具體來說,我想展現除以1000,而不是價值本身的價值。

我知道如果我顯示它,我可以爲標記設置標籤,但用戶將不得不猜測實際值。

我也知道,我可以使用this answer刪除標籤,然後實現我自己的標籤,使用滑塊進行更新,但這正是我想要避免的。

考慮到JSlider不支持雙打,這看起來確實很明顯。

回答

2

具體而言,我想顯示的值除以1000而不是值本身。

這可能會實現:label.setText(String.format("%.3f", slider.getValue()/1000f));

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public final class SliderTooltipTest { 
    private JComponent makeUI() { 
    JSlider slider = new JSlider(1, 100000) { 
     private SliderPopupListener popupHandler; 
     @Override public void updateUI() { 
     removeMouseMotionListener(popupHandler); 
     removeMouseListener(popupHandler); 
     removeMouseWheelListener(popupHandler); 
     super.updateUI(); 
     popupHandler = new SliderPopupListener(); 
     addMouseMotionListener(popupHandler); 
     addMouseListener(popupHandler); 
     addMouseWheelListener(popupHandler); 
     } 
    }; 
    slider.setMajorTickSpacing(10000); 
    slider.setPaintTicks(true); 

    JPanel p = new JPanel(); 
    p.setBorder(BorderFactory.createEmptyBorder(50, 10, 50, 10)); 
    p.add(new JLabel("1")); 
    p.add(slider); 
    p.add(new JLabel("100Gb/s")); 
    return p; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    try { 
     for (UIManager.LookAndFeelInfo laf: UIManager.getInstalledLookAndFeels()) { 
     if ("Nimbus".equals(laf.getName())) { 
      UIManager.setLookAndFeel(laf.getClassName()); 
     } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new SliderTooltipTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 

class SliderPopupListener extends MouseAdapter { 
    private final JWindow toolTip = new JWindow(); 
    private final JLabel label = new JLabel("", SwingConstants.CENTER); 
    private final Dimension size = new Dimension(60, 20); 
    private int prevValue = -1; 

    public SliderPopupListener() { 
    super(); 
    label.setOpaque(false); 
    label.setBackground(UIManager.getColor("ToolTip.background")); 
    //label.setBorder(UIManager.getBorder("ToolTip.border")); 
    label.setBorder(BorderFactory.createLineBorder(Color.CYAN.darker())); 
    toolTip.add(label); 
    toolTip.setSize(size); 
    } 
    protected void updateToolTip(MouseEvent me) { 
    JSlider slider = (JSlider) me.getComponent(); 
    int intValue = (int) slider.getValue(); 
    if (prevValue != intValue) { 
     label.setText(String.format("%.3f", slider.getValue()/1000f)); 
     Point pt = me.getPoint(); 
     pt.y = -size.height; 
     SwingUtilities.convertPointToScreen(pt, me.getComponent()); 
     pt.translate(-size.width/2, 0); 
     toolTip.setLocation(pt); 
    } 
    prevValue = intValue; 
    } 
    @Override public void mouseDragged(MouseEvent me) { 
    toolTip.setVisible(true); 
    updateToolTip(me); 
    } 
    @Override public void mouseReleased(MouseEvent me) { 
    toolTip.setVisible(false); 
    } 
} 
+0

這並沒有直接回答我的問題,但它似乎像什麼,我問了一個可以接受的選擇,如果你加什麼我原本想要的是不可能的。 – Vaelus