2012-06-01 3 views
3

사용자 입력을 사용하려는 일부 텍스트 필드를 만들었습니다. 나는 documentListener를 사용해야한다고 읽었지 만, 나는 생각하기에 그것을 구현하는 데 어려움이있다.documentlistener 구현 방법

코드에서 텍스트 필드 tf1에 구현하려고합니다. 입력 된 메신저가 두 번 파싱되어야하므로 수학 계산을 할 수 있습니다.

여기 내 코드를 구현하려고합니다.

다음 가능한 방법 (블록 실행) 번호 포매터의 JFormattedTextField를 사용하는 직접하는 DocumentFilter를 구현거나 당신이 번호를

import java.awt.ComponentOrientation; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 


public class Display { 
final static boolean shouldFill = true; 
final static boolean shouldWeightX = true; 
final static boolean RIGHT_TO_LEFT = false; 

public static void addComponentsToPane(Container pane) { 

    if (RIGHT_TO_LEFT) { 
     pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
    } 
    JButton button; 
    JLabel label; 

    pane.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    if (shouldFill) { 
    //natural height, maximum width 
    c.fill = GridBagConstraints.HORIZONTAL; 
    } 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 

    ... 

    button = new JButton("Value Bet"); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.ipady = 0; 
    c.gridx = 0; 
    c.gridy = 1; 
    pane.add(button, c); 
    button.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) 
     { 
      //Execute when button is pressed 
      JFrame frame = new JFrame("Value Bet"); 
      frame.setVisible(true); 
      frame.setSize(500,300); 
      GridBagLayout layout = new GridBagLayout(); 
      frame.setLayout(layout); 
      GridBagConstraints c = new GridBagConstraints(); 

      JLabel label; 
      JTextField tf; 

      if (shouldFill) { 
      //natural height, maximum width 
      c.fill = GridBagConstraints.HORIZONTAL; 
      } 
      if (shouldWeightX) { 
      c.weightx = 0.5; 
      } 

      ... 

      final JTextField tf1 = new JTextField(); 
      c.fill = GridBagConstraints.HORIZONTAL; 
      c.gridx = 1; 
      c.gridy = 2; 
      frame.add(tf1, c); 

      tf1.getDocument().addDocumentListener(new DocHandler(){ 
       public class DocHandler implements DocumentListener{ 

        @Override 
        public void changedUpdate(DocumentEvent arg0) { 
         tfHasChanged(); 

        } 

        @Override 
        public void insertUpdate(DocumentEvent arg0) { 
         tfHasChanged(); 

        } 

        @Override 
        public void removeUpdate(DocumentEvent arg0) { 
         tfHasChanged(); 

        } 

       } 

       public void tfHasChanged(){ 
        double chance1 = Double.parseDouble(tf1.getText()); 
       } 
      });  

      ... div components 


} 

private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("Betting Application"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Set up the content pane. 
     addComponentsToPane(frame.getContentPane()); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

나는이 모든 방법을 드롭하고 내가 권장하는 모달 대화 상자를 사용하는 것이 좋습니다 마지막 질문에 [내 대답] (http://stackoverflow.com/a/10846008/418556)을 입력하십시오. 또는 최선의 도움을 얻으려면 최소한 왜 그런 접근법을 사용하지 않으려는지 설명하십시오. –

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

답변

4

formatter.setMinimum(0.0); 
formatter.setMaximum(1000.00); 

을 codelines 예를 들어, textField1에 대한 몇 가지 공식을 추가 textField1textField2의 값과 같습니다.

import java.awt.*; 
import java.awt.font.TextAttribute; 
import java.math.*; 
import java.text.*; 
import java.util.Map; 
import javax.swing.*; 
import javax.swing.JFormattedTextField.*; 
import javax.swing.event.*; 
import javax.swing.text.InternationalFormatter; 

public class DocumentListenerAdapter { 

    public static void main(String args[]) { 
     JFrame frame = new JFrame("AbstractTextField Test"); 
     final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01)); 
     textField1.setFormatterFactory(new AbstractFormatterFactory() { 

      @Override 
      public AbstractFormatter getFormatter(JFormattedTextField tf) { 
       NumberFormat format = DecimalFormat.getInstance(); 
       format.setMinimumFractionDigits(2); 
       format.setMaximumFractionDigits(2); 
       format.setRoundingMode(RoundingMode.HALF_UP); 
       InternationalFormatter formatter = new InternationalFormatter(format); 
       formatter.setAllowsInvalid(false); 
       formatter.setMinimum(0.0); 
       formatter.setMaximum(1000.00); 
       return formatter; 
      } 
     }); 
     final Map attributes = (new Font("Serif", Font.BOLD, 16)).getAttributes(); 
     attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); 
     final JFormattedTextField textField2 = new JFormattedTextField(new Float(10.01)); 
     textField2.setFormatterFactory(new AbstractFormatterFactory() { 

      @Override 
      public AbstractFormatter getFormatter(JFormattedTextField tf) { 
       NumberFormat format = DecimalFormat.getInstance(); 
       format.setMinimumFractionDigits(2); 
       format.setMaximumFractionDigits(2); 
       format.setRoundingMode(RoundingMode.HALF_UP); 
       InternationalFormatter formatter = new InternationalFormatter(format); 
       formatter.setAllowsInvalid(false); 
       //formatter.setMinimum(0.0); 
       //formatter.setMaximum(1000.00); 
       return formatter; 
      } 
     }); 
     textField2.getDocument().addDocumentListener(new DocumentListener() { 

      @Override 
      public void changedUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      @Override 
      public void insertUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      private void printIt(DocumentEvent documentEvent) { 
       DocumentEvent.EventType type = documentEvent.getType(); 
       double t1a1 = (((Number) textField2.getValue()).doubleValue()); 
       if (t1a1 > 1000) { 
        Runnable doRun = new Runnable() { 

         @Override 
         public void run() { 
          textField2.setFont(new Font(attributes)); 
          textField2.setForeground(Color.red); 
         } 
        }; 
        SwingUtilities.invokeLater(doRun); 
       } else { 
        Runnable doRun = new Runnable() { 

         @Override 
         public void run() { 
          textField2.setFont(new Font("Serif", Font.BOLD, 16)); 
          textField2.setForeground(Color.black); 
         } 
        }; 
        SwingUtilities.invokeLater(doRun); 
       } 
      } 
     }); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(textField1, BorderLayout.NORTH); 
     frame.add(textField2, BorderLayout.SOUTH); 
     frame.setVisible(true); 
     frame.pack(); 
    } 

    private DocumentListenerAdapter() { 
    } 
} 
+0

''Value Bet "주어진''최고의 구성 요소가''NumberModel''을 가진'JSpinner'가 될 것이라고 생각합니다. 그러나 OP는 나를 무시하는 것처럼 보입니다. :) –

+1

@Andrew Thompson BNI, 기본적으로 내 나쁜 내가 내 정신 healt을 보호하는 것입니다 askers userprofiles을 확인하지 마십시오 :-) – mKorbel

+0

나는 데자뷰의 압도적 인 감각을 가지고있을 때 일반적으로 프로파일을 확인하지 않습니다. , 그리고 흥분하지 않는다면, 그 재미 있은 작은 예고편은 내가 위키피디아의 [Déjà vu] (http://en.wikipedia.org/wiki/D%C3%A9j%C3%A0_vu)를 복사/붙여 넣기 때문에 아마 맞을 것입니다;). –

1

TF1가 텍스트 필드 다음 문서 리스너 해, ChangedUpdate, insertUpdate 추천 방법을 구현 할 경우, 내의 removeUpdate

tf1.getDocument().addDocumentListener(new DocumentListener() { 

    @Override 
     public void changedUpdate(DocumentEvent e){ 

           //do some math 
           tf1.getText(); 
            } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 

            /do some math 
           tf1.getText(); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      // TODO Auto-generated method stub 

     } 
});