2009-10-10 73 views
4

鏈接JSlider和JTextField的最好和最簡單的方法是什麼,如果一個改變了,另一個也會被更新,但是沒有遞歸循環?Java:鏈接JSlider和JTextfield的浮點值

謝謝!

+0

相關http://stackoverflow.com/questions/2172574/jslider-for-doubles –

回答

12

這裏有一個快速和骯髒的演示:

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

public class Main { 
    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     final JTextField text = new JTextField(20); 
     final JSlider slider = new JSlider(0, 100, 0); 
     slider.addChangeListener(new ChangeListener(){ 
      @Override 
      public void stateChanged(ChangeEvent e) { 
       text.setText(String.valueOf(slider.getValue())); 
      } 
     }); 
     text.addKeyListener(new KeyAdapter(){ 
      @Override 
      public void keyReleased(KeyEvent ke) { 
       String typed = text.getText(); 
       slider.setValue(0); 
       if(!typed.matches("\\d+") || typed.length() > 3) { 
        return; 
       } 
       int value = Integer.parseInt(typed); 
       slider.setValue(value); 
      } 
     }); 
     frame.setLayout(new BorderLayout()); 
     frame.add(text, BorderLayout.NORTH); 
     frame.add(slider, BorderLayout.CENTER); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.pack(); 
    } 
} 

編輯

如果你想使用浮點數(如標題所暗示的),你可以擴展JSlider類的這樣的:

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

public class Main { 
    public static void main(String[] args) { 
     final DecimalFormat df = new DecimalFormat("0.####"); 
     final JFrame frame = new JFrame(); 
     final JTextField text = new JTextField(20); 
     final DoubleJSlider slider = new DoubleJSlider(0, 100, 0, 1000); 
     slider.addChangeListener(new ChangeListener(){ 
      @Override 
      public void stateChanged(ChangeEvent e) { 
       text.setText(df.format(slider.getScaledValue())); 
      } 
     }); 
     text.addKeyListener(new KeyAdapter(){ 
      @Override 
      public void keyReleased(KeyEvent ke) { 
       String typed = text.getText(); 
       slider.setValue(0); 
       if(!typed.matches("\\d+(\\.\\d*)?")) { 
        return; 
       } 
       double value = Double.parseDouble(typed)*slider.scale; 
       slider.setValue((int)value); 
      } 
     }); 
     frame.setLayout(new BorderLayout()); 
     frame.add(text, BorderLayout.NORTH); 
     frame.add(slider, BorderLayout.CENTER); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.pack(); 
    } 
} 

class DoubleJSlider extends JSlider { 

    final int scale; 

    public DoubleJSlider(int min, int max, int value, int scale) { 
     super(min, max, value); 
     this.scale = scale; 
    } 

    public double getScaledValue() { 
     return ((double)super.getValue())/this.scale; 
    } 
} 

上面的例子表示在100個步驟中0到0.1之間的間隔。

這(再次)只是一個快速和骯髒的例子,但可能會幫助你的方式。

+1

這是隻使用int值。 – Guillaume

+0

@Guillaume,啊,我剛纔想到在主題標題(而不是問題本身)中提到了float這個詞。但是,自從鉗子接受了我的回答後,似乎轉向使用花車並不是那麼困難,幸運的是。 :) –

+0

嗯,這不是微不足道的:)而'浮動'標籤應該從問題中刪除:我雖然我的追求使用浮動滑塊已經結束,但它不是! – Guillaume