2012-01-02 3 views
4

우선, 이전에 비슷한 질문을 한 적이 있습니다.하지만이 질문은 다릅니다. 나는이 편집 가능한 텍스트 필드 인 에 입력 된 모든 숫자의 산술 평균을 만드는 계산기를 만들려고합니다. 약 25 개의 텍스트 필드가 있지만 한 번에 14-16 개만 편집 할 수 있습니다. 사용자는 이미 프로그램에있는 편집 가능한 텍스트 필드를 추가하거나 제거 할 수있는 3 명의 jspinner를 보유하고 있습니다. 내 질문은, 당신은 어떻게 그 텍스트 필드를 편집 할 수 있으며 데이터를 조작 할 수 있습니까?고급 형식의 텍스트 필드 입력 조작?

검토 목적으로이 질문은 다른 질문과 다릅니다. 다른 질문에서 저는 전혀 구체적이지 않았고, 다른 것이 었습니다. 그래서이 문을 열어두면 도움이 필요합니다.

+2

제공하십시오 [문제]에 현재의 접근 방식 (http://stackoverflow.com/q/8680285/를 보여주고 있다는 [sscce] (http://sscce.org/) 230513). 간결함을 위해 텍스트 필드와 스피너의 최소 수를 보여줍니다. – trashgod

+0

프로그램의 코드는 1600+ 라인이며 지저분합니다. 내 접근 방식에 관해서는 아무도 없지만 IF 문을 수동으로 시도했지만 버튼을 클릭하면 14 개의 Java 오류가 발생합니다. 텍스트 필드의 최소 수는 13이고 최대 값은 25입니다. 나는 항상 활성화 된 3 개의 jspinners를 가지고 있습니다. 첫 번째의 최소값은 5이고 최대 값은 12입니다. 두 번째 값의 최소값은 0이고 최대 값은 3입니다. 세 번째 값의 최소값은 0이고 최대 값은 5입니다. – Bugster

+0

@ user1115506 trashgod처럼, 테스트 케이스를 게시하지 마십시오. 코드를 다시 살펴보고 관련 조각을 추출하여 붙여 넣으십시오. – asgs

답변

6

한 번에 한 가지 문제를 해결하십시오. 먼저 example으로 시작하십시오. 아래와 같이 여러 필드를 처리하도록 변경하십시오. 평균을 찾아내는 것은 지금 update()에 간단한 변화이다.

image

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.text.NumberFormat; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFormattedTextField; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** 
* @see https://stackoverflow.com/q/8703464/230513 
* @see https://stackoverflow.com/questions/6803976 
*/ 
public class Adder extends JPanel { 

    private static final int MAX = 3; 
    private final List<JFormattedTextField> fields = 
     new ArrayList<JFormattedTextField>(); 
    private final NumberFormat format = NumberFormat.getNumberInstance(); 
    private final JFormattedTextField sum = new JFormattedTextField(format); 

    public Adder() { 
     this.setLayout(new GridLayout(0, 1)); 
     for (int i = 0; i < MAX; i++) { 
      JFormattedTextField tf = init(); 
      fields.add(tf); 
      this.add(tf); 
     } 
     sum.setHorizontalAlignment(JFormattedTextField.RIGHT); 
     sum.setEditable(false); 
     sum.setFocusable(false); 
     this.add(sum); 
    } 

    private JFormattedTextField init() { 
     JFormattedTextField jtf = new JFormattedTextField(format); 
     jtf.setValue(0); 
     jtf.setHorizontalAlignment(JFormattedTextField.RIGHT); 
     jtf.addFocusListener(new FocusAdapter() { 

      @Override 
      public void focusLost(FocusEvent e) { 
       EventQueue.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         update(); 
        } 
       }); 
      } 
     }); 
     jtf.addPropertyChangeListener("value", new PropertyChangeListener() { 

      @Override 
      public void propertyChange(PropertyChangeEvent e) { 
       update(); 
      } 
     }); 
     return jtf; 
    } 

    private void update() { 
     long total = 0; 
     for (JFormattedTextField tf : fields) { 
      Number v = (Number) tf.getValue(); 
      total += v.longValue(); 
     } 
     sum.setValue(total); 
    } 

    private void display() { 
     JFrame f = new JFrame("Adder"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Adder().display(); 
      } 
     }); 
    } 
} 
+0

너무 늦었 어 +1, 수정 범프 --- 좋은 코드 – mKorbel

+0

훌륭한 답변, 내 문제에 대한 해결책처럼 보입니다. +1 및 표시된 – Bugster

+0

각 수신기의 단일 인스턴스를 사용하는 변형이 여기에 표시됩니다. [http] : //stackoverflow.com/a/31764798/230513). – trashgod