2013-07-10 2 views
2

Это мой GUI:Установить поведение тик качели JSlider и JTextField

enter image description here

Ниже SSCCE, который будет производить именно это. JSlider подключен к JTextField, показывая значения от 0 до 100.

Я установил следующее, чтобы остановить его с интервалом в 10. Он работает, но текстовое поле по-прежнему будет показывать значения между 10 с (как 73), когда перетаскивание, а затем отрегулируйте его, когда я отпустил ползунок. Есть ли способ показать только десятки, даже при перетаскивании?

js.setMinorTickSpacing(10); 
js.setSnapToTicks(true); 

SSCCE:

import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.text.NumberFormat; 
import javax.swing.*; 
import javax.swing.event.*; 
import net.miginfocom.swing.MigLayout; 

public class SSCCE { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("SSCCE JSlider + JTextField"); 
     JPanel panel = new JPanel(new MigLayout("", "[200!][100!]", "")); 

     final JSlider js = new JSlider(); 
     final JFormattedTextField tf = new JFormattedTextField(NumberFormat.getNumberInstance()); 

     js.addChangeListener(new ChangeListener() { 
      @Override 
      public void stateChanged(ChangeEvent e) { 
       tf.setText(String.valueOf(js.getValue())); 
      } 
     }); 
     tf.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyReleased(KeyEvent ke) { 
       String typed = tf.getText(); 
       js.setValue(0); 
       if (!typed.matches("\\d+")) { 
        return; 
       } 
       int value = Integer.parseInt(typed); 
       js.setValue(value); 
      } 
     }); 
     js.setMinorTickSpacing(10); 
     js.setSnapToTicks(true); 

     panel.add(js); 
     panel.add(tf, "grow"); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+1

+1 за sscce ... –

ответ

4

Он работает, но текстовое поле по-прежнему показывают значения между 10s (как 73) при перемещении, а затем настроить его, когда я отпустила слайдер. Есть ли способ показать только десятки, даже при перетаскивании?

Просто округлить текущее JSlider значение в ближайшие 10 лет и чем установить JTextField на этот номер:

js.addChangeListener(new ChangeListener() { 
      @Override 
      public void stateChanged(ChangeEvent e) { 

       if(js.getValueIsAdjusting()) {//slider value is still being adjusted 
        int num=(int)(Math.rint((double) js.getValue()/10) * 10);//round to nearest 10 
        tf.setText(String.valueOf(num));//set textfield with value of nearest 10     
       } else {//slider value has been set/no adjustments happenening 
        tf.setText(String.valueOf(js.getValue())); 
       } 

      } 
     }); 

также прочитанный на Concurrency in Swing, в частности, на Event Dispatch thread (EDT), что требует от нас, чтобы создать и управлять все компоненты Свинг на EDT через SwingUtilities.invokeXXX блока:

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     //create/manipulate UI, components etc here 
    } 
}); 
+0

Спасибо за ваше время. Однако это не делает именно то, что я хочу. Он избавляется от показа номера между десятилетиями, что хорошо. Но я также хочу, чтобы число менялось при перетаскивании. – Goatcat

+1

@Goatcat см. Обновленное сообщение, надеюсь, что это поможет, обратите внимание, что оно закодировано из головы, поэтому, возможно, небольшие ошибки синтаксиса или скомпилировать ошибку, если что-нибудь –

+1

Также рассмотрите ['SpinSlider'] (http://stackoverflow.com/a/6067986/230513). – trashgod

Смежные вопросы