2016-08-07 10 views
1

eJuice Calculatorを作成しています。あなたが以下に見ていくように、その近くにはどこもありません。私の質問は:4つのJCheckBoxと5つの編集可能なJTextFieldがあります。私は1つのActionListenerを使って、プログラムが何かを実行させることができますか?または、CheckBoxとTextFieldに1つのリスナーが必要ですか?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

基本的な経験則:特定のアクションごとに1つのリスナーを使用します。 –

+0

@Dici私はJavaでプログラミングして以来、長い間続いてきました。先端に感謝します。 –

答えて

1

私の質問は:私は4 JCheckBoxes、および5つの編集可能なのJTextFieldを持っています。私は1つのActionListenerを使って、プログラムが何かを実行させることができますか?または、CheckBoxとTextFieldに1つのリスナーが必要ですか?

コントロールコンポーネントはたくさんありますが、GUIからアクションを開始するコンポーネントはありません。むしろそれらのすべて、JCheckBoxesとJTextFieldsは入力を取得するためにあり、JButtonのような最終的なコンポーネントが1つも欠けているようです。私はあなたのGUIにこのコンポーネントを追加し、それに単独のActionListenerを追加します。そして、それを押すと、チェックボックスとテキストコンポーネントの状態をチェックし、それらの状態に基づいて、ユーザーに適切な応答を与えます。

JTextFieldのほとんどまたはすべてではないにしても、JComboBoxesまたはJSpinnersのいずれかに変更して、ユーザーが入力可能な入力を制限することもできます。これは、 「バッチサイズ」の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()); 
    } 
} 
関連する問題