2

すべてのフィールドに有効なデータ、つまり数値があり、負の数がない場合にのみ有効になるボタンが 2 つあります。

4

4 に答える 4

5

JTextField が保持するドキュメントをリッスンする DocumentListener の使用を検討します。このサイトには、この種の例があります (1 つまたは 2 つ書いているので、知っています)。

例えば、

import java.awt.Component;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.JTextComponent;

public class DocumentListenerFun extends JPanel {
   private static final int FIELD_COUNT = 5;
   private JTextField[] fields = new JTextField[FIELD_COUNT];
   private JButton fooBtn = new JButton("Foo");
   private JButton barBtn = new JButton("Bar");
   private MyFieldListener myFieldListener = new MyFieldListener();

   public DocumentListenerFun() {
      fooBtn.setEnabled(false);
      barBtn.setEnabled(false);
      for (int i = 0; i < fields.length; i++) {
         fields[i] = new JTextField(10);
         add(fields[i]);
         myFieldListener.addTextComponent(fields[i]);
      }
      myFieldListener.addComponentsToEnable(fooBtn);
      myFieldListener.addComponentsToEnable(barBtn);
      add(fooBtn);
      add(barBtn);
   }

   private static void createAndShowGui() {
      DocumentListenerFun mainPanel = new DocumentListenerFun();

      JFrame frame = new JFrame("DocumentListenerFun");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyFieldListener {
   private List<JTextComponent> textComponents = new ArrayList<JTextComponent>();
   private List<Component> componentsToEnable = new ArrayList<Component>();
   private MyDocListener myDocListener = new MyDocListener(this);

   public void addTextComponent(JTextComponent textComponent) {
      textComponents.add(textComponent);
      textComponent.getDocument().addDocumentListener(myDocListener);
   }

   public void addComponentsToEnable(Component comp) {
      componentsToEnable.add(comp);
   }

   public void docsChanged() {
      boolean textVerified = true;
      for (JTextComponent textComp : textComponents) {
         String text = textComp.getText();
         textVerified &= verifyText(text);
      }

      for (Component comp : componentsToEnable) {
         comp.setEnabled(textVerified);
      }

   }

   private boolean verifyText(String text) {
      try {
         int value = Integer.parseInt(text.trim());
         if (value > 0) {
            return true;
         }
      } catch (NumberFormatException e) {
         return false;
      }
      return false;
   }
}

class MyDocListener implements DocumentListener {

   private MyFieldListener myFieldListener;

   public MyDocListener(MyFieldListener myFieldListener) {
      this.myFieldListener = myFieldListener;
   }

   @Override
   public void changedUpdate(DocumentEvent e) {
      myFieldListener.docsChanged();
   }

   @Override
   public void insertUpdate(DocumentEvent e) {
      myFieldListener.docsChanged();
   }

   @Override
   public void removeUpdate(DocumentEvent e) {
      myFieldListener.docsChanged();
   }

}
于 2012-10-12T02:53:24.063 に答える
5

または、ここに示され、ここで説明されている の方法検討shouldYieldFocus()してくださいInputVerifier

于 2012-10-12T02:57:35.340 に答える
0

Key リスナーを使用するか、JTextField で focuslost を使用します。

http://www.java2s.com/Tutorial/Java/0240__Swing/ListeningtoJTextFieldEventswithanKeyListener.htm

http://docs.oracle.com/javase/tutorial/uiswing/events/focuslistener.html

于 2012-10-12T02:56:40.910 に答える
0

負の値を許可したくない場合は、DocumentFilter を使用できます。

/**
 * REF: http://www.coderanch.com/t/345628/GUI/java/DocumentFilter
 */
public class NumericFilter extends DocumentFilter {

    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset,
            String text, AttributeSet attr) throws BadLocationException {
        fb.insertString(offset, text.replaceAll("\\D", ""), attr);
    }

    // no need to override remove(): inherited version allows all removals  
    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
            String text, AttributeSet attr) throws BadLocationException {
        fb.replace(offset, length, text.replaceAll("\\D", ""), attr);
    }
}

次に使用する

((AbstractDocument)(new JTextField).getDocument()).setDocumentFilter(new NumericFilter());
于 2012-10-12T02:59:43.447 に答える