2013-12-24 5 views
2

Я узнал немного больше о Java GUI. Однако я столкнулся с проблемой и не знаю, как ее исправить.Java - JFormattedTextField AddActionListener

У меня есть часть моей программы (отображается ниже, но неактуальный код удален), и все, кроме функции JFormattedTextField (sliderField), работает. То, что я пытаюсь сделать, это сделать так, если значение набирается в sliderField, которое больше 5000, и панель обновляется (уже сделано в другом месте), поле изменится на 5000. Однако по какой-то причине actionPerformed не похоже, регистрируют какие-либо изменения в моем JFormattedTextField, также предотвращая изменение переменной.

Вот мой код:

public class testMenu extends JPanel implements ActionListener, ChangeListener { 
    public testMenu(GUI p) { 
     parent = p; 
     setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); 
     createPanel(); 
     setVisible(true); 
    } 

    public void createPanel() { 
     createOptions(); 
    } 

    private void createOptions() { 
     options[0] = new JPanel(); 
     add(options[0]); 

     options[1] = new JPanel(); 
     add(options[1]); 

     options[2] = new JPanel(); 
     add(options[2]); 

     options[3] = new JPanel(); 
     add(options[3]); 

     options[4] = new JPanel(); 
     add(options[4]); 

     slider = new JSlider(0, 5000, 0); 
     slider.setPaintTicks(true); 
     slider.setValue(parent.variable); 
     slider.addChangeListener(this); 
     sliderField = new JFormattedTextField(NumberFormat.getInstance()); 
     sliderField.setText(Integer.toString(parent.variable)); 
     sliderField.setColumns(4); 
     sliderField.addActionListener(this); 

     options[5] = new JPanel(); 
     options[5].add(new JLabel("Slider Value:")); 
     options[5].add(slider); 
     options[5].add(sliderField); 
     options[5].setVisible(false); 

     add(options[5]); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == sliderField) { 
      int size = Integer.parseInt(sliderField.getText()); 
      System.out.println(size); 
      if (size > 5000) { 
       sliderField.setText("5000"); 
       size = 5000; 
      } 
      parent.setVariable("" + size); 
     } 
    } 

    private GUI parent; 

    private JSlider slider; 
    private JFormattedTextField sliderField; 

    private JPanel[] options = new JPanel[5]; 
} 

Мой вопрос прост: Почему actionPerformed не регистрации каких-либо действий делается на JFormattedTextField, и как я могу это исправить?

Кроме того, как бы я установил свой JFormattedTextField, поэтому, если значение больше, чем 999, никакие запятые не добавляются (предотвращение 1000 от 1000 до 1000)?

+0

См. Правки для ответа. –

ответ

3

Чтобы избавиться от запятых, просто используйте форматтер, который их не позволяет. например,

NumberFormat format = NumberFormat.getInstance(); 
    format.setGroupingUsed(true); // *** set it so it doesn't use a grouping *** 
    final JFormattedTextField formattedField = new JFormattedTextField(format); 
    formattedField.setColumns(10); 

Что касается вашей другой проблемы, что делать, если вы получаете и устанавливаете значение, а не текст?

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.NumberFormat; 

import javax.swing.JFormattedTextField; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class TestJFormattedText { 
    public static void main(String[] args) { 
     NumberFormat format = NumberFormat.getNumberInstance(); 
     format.setGroupingUsed(false); 
     final JFormattedTextField formattedField = new JFormattedTextField(format); 
     formattedField.setColumns(10); 

     formattedField.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      long value = ((Long)formattedField.getValue()).longValue(); 
      if (value > 5000) { 
       formattedField.setValue(5000); 
      } 
     } 
     }); 


     JPanel panel = new JPanel(); 
     panel.add(formattedField); 
     JFrame frame = new JFrame("Foo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

Преимущество использования значений является то, что вам избежать досадных NumberFormatExceptions если текст удерживается JFormattedTextField не подходит, не соответствуют форматеру.


Как и в сторону, ваш код размещен в вашем вопросе содержит совсем немного кода, не связанного с вашей проблемой, а не компилировать или запускать для нас. В будущем подумайте о размещении только кода, который необходим как для показа проблемы, так и для запуска кода, вроде того, что я написал выше.


Редактировать
Вы спросите в комментариях,

Как я могу сделать это, так что я не нужно ударить «Enter» для ActionEvent выполнить?

Вы не можете так работать, как ActionListeners для JTextFields и для классов, полученных из JTextFields. Я полагаю, вы могли бы добавить DocumentFilter в документ JFormattedTextField, если вы хотите возиться с содержимым поля до, оно отображается само по себе, но пока я использовал их с JTextFields, я никогда не использовал их с документами, используемыми с JFormattedTextFields и не могу сказать, что по опыту знаю, что это сработает.

+0

Отлично, спасибо! Теперь запятые не отображаются, что является фантастическим. Ваше исправление для моего actionEvent также работало, однако у меня есть быстрый вопрос о последующих действиях. Как я могу это сделать, поэтому мне не нужно ударять «Enter» для запуска actionEvent? – Mko

+0

@Mko: См. Править для ответа. –

+0

Хорошо, что очень помогает. Спасибо за все, и счастливые праздники!:) – Mko

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