2012-10-24 44 views
1

我使用NetBeans 7.2。Java JSlider.getvalue將良好的值返回給JTextField,對toolTipText錯誤

我有一個JSlider slider_random在我JPanel1,輸入值100,最低0,最大1000。我通過屬性(自定義代碼)設置slider_random一個toolTipText

"<html>Range (0-" + String.valueOf(slider_random.getMaximum()) + ")<br>Current: " + String.valueOf(slider_random.getValue()) 

此外置於JTextField text_current和設置文本到100,這將顯示的slider_random當我改變它的值。

我設置stateChanged事件slider_random

private void slider_randomStateChanged(javax.swing.event.ChangeEvent evt) { 
    slider_random.setToolTipText("<html>Range (0-" + String.valueOf(slider_random.getMaximum()) + ")<br>Current: " + String.valueOf(slider_random.getValue())); 
    jTextField1.setText(String.valueOf(slider_random.getValue())); 
} 

我的問題是,當我啓動程序並指向滑塊它表明:

範圍(0-1000)

當前:50

然後將滑塊移動一點點,並返回到原來的位置(同時,我可以看到text_current變化)所有數據變得正確,提示說:

範圍(0-1000)

電流:100

什麼會導致我的問題?

Here's the screenshot, after I lauched it.

+0

任何在控制檯中的異常?你能發佈代碼嗎? –

+0

@Atitila我能夠重現你的問題。將看看我是否找到解決方案。 – agirish

+0

@Dan沒有任何異常顯示,當然有0個警告,0個錯誤在建設。 – Attila

回答

3

我能攝製您的問題。

問題是jSlider的默認值是50.您將該值修改爲100,但這並未反映在您通過jSlider的值(通過自定義代碼)訪問jSlider的setToolTip()方法中。它會顯示50的舊值。

要解決此問題,一種解決方案是在滑塊上創建鼠標懸停事件,以便當您運行應用程序並將鼠標指針懸停在滑塊上時,jToolTip方法會選擇最新的價值,並顯示你一樣。它爲我工作,所以我相信它會爲你工作。

如果我能想到一個更好的解決辦法,我會發布相同。

+0

它工作正常,我能夠在5秒內完成此操作。 (我可以在tooltiptext中寫下如「Current:100」的值,但如果我想改變我的init值,我必須重寫工具提示,但你的解決方案是完美的。)謝謝! – Attila

1

也許以後滑塊的價值已經被設置在監聽者添加。您可能需要更改訂單。或者,爲了解決初始化問題,您可能需要在初始化滑塊後明確設置工具提示。

作爲替代你也可以繼承JSlider並覆蓋getToolTipText,例如:

JSlider slider = new JSlider() { 
    public String getToolTipText(MouseEvent e) { 
     return "<html>Range (0-" + String.valueOf(getMaximum()) + ")<br>Current: " + String.valueOf(getValue()); 
    } 
}; 

這裏是一個簡短的演示:

import java.awt.event.MouseEvent; 

import javax.swing.BorderFactory; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JSlider; 

public class TestSlider { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("TestSlider"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JSlider slider = new JSlider() { 
      public String getToolTipText(MouseEvent e) { 
       return "<html>Range (0-" + String.valueOf(getMaximum()) 
         + ")<br>Current: " + String.valueOf(getValue()); 
      } 
     }; 
     slider.setToolTipText(""); 

     frame.add(slider); 

     ((JComponent) frame.getContentPane()).setBorder(BorderFactory 
       .createEmptyBorder(10, 10, 10, 10)); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
0

我覺得做這個動作最好的辦法,就是要在你的滑塊附近做一個標籤,然後把一個變量像一個整數而不是「y」或放置得到值而不是「y」,&你需要的事件是Item狀態的改變,所以當你移動你的滑塊時標籤將m與滑塊&是要顯示值奧雅納;)

public class Slidebar extends JFrame { 

private JPanel contentPane; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Slidebar frame = new Slidebar(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public Slidebar() { 
    setResizable(false); 
    setTitle("SlideBar With Text Move"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 317, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    final JSlider slider = new JSlider(); 

    slider.setPaintLabels(true); 
    slider.setOrientation(SwingConstants.VERTICAL); 
    slider.setValue(0); 
    slider.setBounds(131, 60, 53, 136); 
    contentPane.add(slider); 

    final JLabel lblNewLabel = new JLabel(""); 
    int y = 165; 
    lblNewLabel.setBounds(111, 173, 41, 30); 
    contentPane.add(lblNewLabel); 
    slider.addChangeListener(new ChangeListener() { 
     public void stateChanged(ChangeEvent arg0) { 
      int y=165; 

      lblNewLabel.setBounds(111, y-(slider.getValue())-5, 41, 30); 


      lblNewLabel.setText(slider.getValue()+""); 

     } 
    }); 






} 

}