2016-08-07 8 views
1

eJuice 계산기를 작성하고 있습니다. 당신이 아래에서 볼 것 인 것에 따라 그 아무 곳에도 거의 끝내지 않았다. 내 질문은 : 4 JCheckBoxes 및 5 편집 가능한 JTextFields; 하나의 ActionListener를 사용하여 프로그램에서 물건을 실행하게 할 수 있습니까? 또는 CheckBox에 대해 하나의 수신기와 TextField에 대해 하나의 수신기가 필요합니까?JCheckBox 및 JTextField에 단일 ActionListener를 사용하는 방법

이것은 대략적인 코드 초안입니다.

package ejuicecalculatorv2; 

    import java.awt.*; 
    import java.awt.event.*; 

    import javax.swing.*; 

     public class EJuiceCalculatorV2 extends JFrame { 
    //Form Controls 
    private JCheckBox isPGbasedNic_CB  = new JCheckBox("PG Based NIC"); 
    private JCheckBox isPGbasedFlavor_CB = new JCheckBox("PG Based Flavor"); 

    private JCheckBox isVGbasedNic_CB  = new JCheckBox("VG Based NIC"); 
    private JCheckBox isVGbasedFlavor_CB = new JCheckBox("VG Based Flavor"); 

    private JTextField batchSize_TF   = new JTextField(5); 
    private JLabel batchSize_LB    = new JLabel("Batch Size:"); 

    private JTextField baseNicStrength_TF = new JTextField(5); 
    private JLabel baseNicStrength_LB  = new JLabel("Base NIC Strength:"); 

    private JTextField targetNicStrength_TF = new JTextField(5); 
    private JLabel targetNicStrength_LB  = new JLabel("Target NIC Strength:"); 

    private JTextField totalNic_TF   = new JTextField(5); 
    private JLabel totalNic_LB    = new JLabel("Total NIC:"); 

    private JTextField flavorStrength_TF = new JTextField(5); 
    private JLabel flavorStrength_LB  = new JLabel("Flavoring Strength:"); 

    private JTextField totalFlavor_TF  = new JTextField(5); 
    private JLabel totalFlavor_LB   = new JLabel("Total Flavoring:"); 

    private JTextField vgRatio_TF   = new JTextField(5); 
    private JLabel vgRatio_LB    = new JLabel("VG Ratio:"); 

    private JTextField pgRatio_TF   = new JTextField(5); 
    private JLabel pgRatio_LB    = new JLabel("PG Ratio:"); 

    private JTextField additionalVG_TF  = new JTextField(5); 
    private JLabel additionalVG_LB   = new JLabel("Additional VG:"); 

    private JTextField additionalPG_TF  = new JTextField(5); 
    private JLabel additionalPG_LB   = new JLabel("Additional PG:"); 

    private JTextField totalVG_TF   = new JTextField(5); 
    private JLabel totalVG_LB    = new JLabel("Total VG:"); 

    private JTextField totalPG_TF   = new JTextField(5); 
    private JLabel totalPG_LB    = new JLabel("Total PG:"); 

    private JTextField vgBasedIng_TF  = new JTextField(5); 
    private JLabel vgBasedIng_LB   = new JLabel("Total VG Ingredients:"); 

    private JTextField pgBasedIng_TF  = new JTextField(5); 
    private JLabel pgBasedIng_LB   = new JLabel("Total PG Ingredients:"); 


    //Variables 
    private boolean _PGnicFlag; 
    private boolean _VGnicFlag; 

    private boolean _PGflavorFlag; 
    private boolean _VGflavorFlag; 

    private double baseNic; 
    private double targetNic; 
    private double totalNic; 

    private double flavorStrength; 
    private double totalFlavor; 

    private double batchSize; 

    private double totalPG; 
    private double totalVG; 

    private double additionalVG; 
    private double additionalPG; 

    private double pgBasedIng; 
    private double vgBasedIng; 

    private double pgRatio; 
    private double vgRatio; 


    public EJuiceCalculatorV2() { 
     super("EJuice Calculator V2"); 
     setLayout(new FlowLayout()); 

     //Add CheckBoxes 
     add(isPGbasedNic_CB); 
     add(isPGbasedFlavor_CB); 
     add(isVGbasedNic_CB); 
     add(isVGbasedFlavor_CB); 

     //Add TextFields and Labels 
     add(batchSize_LB); 
     add(batchSize_TF); 

     add(vgRatio_LB); 
     add(vgRatio_TF); 

     add(pgRatio_LB); 
     add(pgRatio_TF); 

     add(baseNicStrength_LB); 
     add(baseNicStrength_TF); 

     add(targetNicStrength_LB); 
     add(targetNicStrength_TF); 

     add(flavorStrength_LB); 
     add(flavorStrength_TF); 

     //Add ActionListeners 
     ActionListener actionListener = new ActionHandler(); 
     isPGbasedNic_CB.addActionListener(actionListener); 
     isPGbasedFlavor_CB.addActionListener(actionListener); 
     isVGbasedNic_CB.addActionListener(actionListener); 
     isVGbasedFlavor_CB.addActionListener(actionListener); 
     batchSize_TF.addActionListener(actionListener); 
     vgRatio_TF.addActionListener(actionListener); 
     pgRatio_TF.addActionListener(actionListener); 
     baseNicStrength_TF.addActionListener(actionListener); 
     targetNicStrength_TF.addActionListener(actionListener); 
     flavorStrength_TF.addActionListener(actionListener);  


     pack(); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    class ActionHandler implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent event){ 

      //if event.getSource() == JCheckBox then execute the following code. 


      if(checkBox.isSelected()){ 
       if(checkBox == isPGbasedNic_CB){ 
        _PGnicFlag = true; 
        _VGnicFlag = false; 
        checkBox = isVGbasedNic_CB; 
        checkBox.setSelected(false);     
       } 
       else if(checkBox == isVGbasedNic_CB){ 
        _VGnicFlag = true; 
        _PGnicFlag = false; 
        checkBox = isPGbasedNic_CB; 
        checkBox.setSelected(false); 
       } 
       else if(checkBox == isVGbasedFlavor_CB){ 
        _VGflavorFlag = true; 
        _PGflavorFlag = false; 
        checkBox = isPGbasedFlavor_CB; 
        checkBox.setSelected(false); 
       } 
       else if(checkBox == isPGbasedFlavor_CB){ 
        _PGflavorFlag = true; 
        _VGflavorFlag = false; 
        checkBox = isVGbasedFlavor_CB; 
        checkBox.setSelected(false); 
       } 
      } 
      else{ 
       if(checkBox == isPGbasedNic_CB){ 
        _PGnicFlag = false; 
        _VGnicFlag = true; 
       } 
       else if(checkBox == isVGbasedNic_CB){ 
        _VGnicFlag = false; 
        _PGnicFlag = true; 
       } 
       else if(checkBox == isVGbasedFlavor_CB){ 
        _VGflavorFlag = false; 
        _PGflavorFlag = true; 
       } 
       else if(checkBox == isPGbasedFlavor_CB){ 
        _PGflavorFlag = false; 
        _VGflavorFlag = true; 
       } 
      } 
    } 
} 

public static void main(String[] args) { 
     // TODO code application logic here 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run(){ 
       new EJuiceCalculatorV2().setVisible(true); 
      } 
     }); 
    } 
} 
+2

코드가 필요로하는 첫번째 일은 아무것도하기 전에 리팩터링이다. 하위 구성 요소에 이러한 수십 개의 속성을 캡슐화해야합니다. 그것은 당신 자신의 위엄을위한 것입니다 : p – Dici

+2

기본 경험 법 : 각각의 특정 행동에 대해 하나의 청취자를 사용하십시오. –

+0

@Dici Java로 프로그래밍 한 이후 오래되었습니다. 팁 고마워. –

답변

1

내 질문은 : 나는 4 JCheckBoxes, 5 편집 JTextFields있다; 하나의 ActionListener를 사용하여 프로그램에서 물건을 실행하게 할 수 있습니까? 또는 CheckBox에 대해 하나의 수신기와 TextField에 대해 하나의 수신기가 필요합니까?

제어 구성 요소가 많지만 GUI에서 작업을 시작하는 구성 요소는 표시되지 않습니다. 오히려 그것들 모두는 JCheckBoxes와 JTextFields가 입력을 얻고 JButton과 같은 최종 구성 요소 하나가 누락 된 것처럼 보입니다. GUI에이 구성 요소를 추가하고 단일 ActionListener를 추가합니다. 그런 다음 눌렀을 때 확인란과 텍스트 구성 요소의 상태를 확인한 다음 해당 상태를 기반으로 사용자에게 적절한 응답을 제공합니다.

JTextField의 대부분 또는 전부는 아니더라도 JComboBoxes 또는 JSpinners로 변경하여 사용자가 입력 할 수있는 입력을 제한 할 수 있습니다. 사용자가 " yes "를"Batch Size "JTextField에 추가합니다. 예를 들어

:

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 
import javax.swing.JSpinner.DefaultEditor; 

@SuppressWarnings("serial") 
public class JuiceTwo extends JPanel { 
    private static final String[] FLAVORS = {"Flavor 1", "Flavor 2", "Flavor 3", "Flavor 4"}; 
    private static final Integer[] ALLOWABLE_BATCH_SIZES = {1, 2, 5, 10, 15, 20}; 
    private static final String[] ALLOWABLE_VG_RATIOS = {"1/4", "1/3", "1/2", "1/1", "2/1", "3/1", "4/1", "8/1", "16/1"}; 
    private List<JCheckBox> flavorBoxes = new ArrayList<>(); 
    private JComboBox<Integer> batchSizeCombo; 
    private JSpinner vgRatioSpinner; 

    public JuiceTwo() { 

     // JPanel to hold the flavor JCheckBoxes 
     JPanel flavorPanel = new JPanel(new GridLayout(0, 1)); // hold them in vertical grid 
     flavorPanel.setBorder(BorderFactory.createTitledBorder("Flavors")); 
     for (String flavor : FLAVORS) { 
      JCheckBox flavorBox = new JCheckBox(flavor); 
      flavorBox.setActionCommand(flavor); 
      flavorPanel.add(flavorBox); 
      flavorBoxes.add(flavorBox); 
     } 

     batchSizeCombo = new JComboBox<>(ALLOWABLE_BATCH_SIZES); 

     SpinnerListModel vgRatioModel = new SpinnerListModel(ALLOWABLE_VG_RATIOS); 
     vgRatioSpinner = new JSpinner(vgRatioModel); 
     JComponent editor = vgRatioSpinner.getEditor(); 
     if (editor instanceof DefaultEditor) { 
      ((DefaultEditor)editor).getTextField().setColumns(4); 
     } 


     JButton getSelectionButton = new JButton("Get Selection"); 
     getSelectionButton.setMnemonic(KeyEvent.VK_S); 
     getSelectionButton.addActionListener(new SelectionActionListener()); 

     add(flavorPanel); 
     add(Box.createHorizontalStrut(20)); 
     add(new JLabel("Batch Size:")); 
     add(batchSizeCombo); 
     add(Box.createHorizontalStrut(20)); 
     add(new JLabel("VG Ratio:")); 
     add(vgRatioSpinner); 
     add(Box.createHorizontalStrut(20)); 
     add(getSelectionButton); 
    } 

    private class SelectionActionListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      for (JCheckBox flavorBox : flavorBoxes) { 
       System.out.printf("%s selected: %b%n", flavorBox.getActionCommand(), flavorBox.isSelected()); 
      } 

      System.out.println("Batch Size: " + batchSizeCombo.getSelectedItem());    
      System.out.println("VG Ration: " + vgRatioSpinner.getValue()); 

      System.out.println(); 
     } 
    } 

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

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

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
}