Java 如何为JCheckBox和JTextField使用单个ActionListener
我正在写一个电子计算器。正如你将在下面看到的那样,它还远未完成。我的问题是:我有4个jcheckbox和5个可编辑的JTextFields;我可以用一个ActionListener来执行程序吗。或者我需要一个用于复选框的侦听器和一个用于文本字段的侦听器吗 这是一个粗略的代码草案Java 如何为JCheckBox和JTextField使用单个ActionListener,java,jtextfield,jcheckbox,Java,Jtextfield,Jcheckbox,我正在写一个电子计算器。正如你将在下面看到的那样,它还远未完成。我的问题是:我有4个jcheckbox和5个可编辑的JTextFields;我可以用一个ActionListener来执行程序吗。或者我需要一个用于复选框的侦听器和一个用于文本字段的侦听器吗 这是一个粗略的代码草案 package ejuicecalculatorv2; import java.awt.*; import java.awt.event.*; import javax.swing.*
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);
}
});
}
}
我的问题是:我有4个jcheckbox和5个可编辑的JTextFields;我可以用一个ActionListener来执行程序吗。或者我需要一个用于复选框的侦听器和一个用于文本字段的侦听器吗
您有一堆控制组件,但没有一个会从GUI启动操作。相反,jcheckbox和JTextFields都是用来获取输入的,而您似乎缺少最后一个组件,例如JButton。我会将这个组件添加到您的GUi中,我会将一个ActionListener单独添加到它。然后当按下时,它会检查复选框和文本组件的状态,然后根据它们的状态,给用户适当的响应
另外,如果不是大部分或所有JTextFields,我会改为jcomboxes或jspinner,以将用户可以输入的输入限制在允许的范围内,因为您不希望用户在“Batch Size”JTextField中输入“yes”
例如:
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());
}
}
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.*;
导入javax.swing.JSpinner.DefaultEditor;
@抑制警告(“串行”)
公共类juicewo扩展了JPanel{
私有静态最终字符串[]FLAVORS={“flavor1”、“flavor2”、“flavor3”、“flavor4”};
私有静态最终整数[]允许的批处理大小={1,2,5,10,15,20};
私有静态最终字符串[]允许的_VG_比率={“1/4”、“1/3”、“1/2”、“1/1”、“2/1”、“3/1”、“4/1”、“8/1”、“16/1”};
private-List-flavorboxs=new-ArrayList();
私人JComboBox batchSizeCombo;
私人JSpinner vgRatioSpinner;
公营机构{
//JPanel将持有风味JCheckbox
JPanel-flavorPanel=newjpanel(newgridlayout(0,1));//将它们保持在垂直网格中
flavorPanel.setBorder(BorderFactory.createTitledBorder(“Flavors”);
用于(字符串味道:味道){
JCheckBox-flavorBox=新的JCheckBox(味道);
setActionCommand(flavor);
添加(调味盒);
添加(调味盒);
}
batchSizeCombo=新JComboBox(允许的批次尺寸);
喷丝头列表模型vgRatioModel=新喷丝头列表模型(允许的_VG_比率);
vgRatioSpinner=新的JSpinner(vgRatioModel);
JComponent editor=vgRatioSpinner.getEditor();
if(编辑器实例of DefaultEditor){
((DefaultEditor)editor.getTextField().setColumns(4);
}
JButton getSelectionButton=新JButton(“获取选择”);
getSelectionButton.Set助记符(KeyEvent.VK_S);
getSelectionButton.addActionListener(新建SelectionActionListener());
添加(面板);
增加(框。创建水平支柱(20));
添加(新JLabel(“批量:”);
添加(batchSizeCombo);
增加(框。创建水平支柱(20));
添加(新的JLabel(“VG比率”);
添加(VG内部);
增加(框。创建水平支柱(20));
添加(getSelectionButton);
}
私有类SelectionActionListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
用于(JCheckBox调味盒:调味盒){
System.out.printf(“%s已选择:%b%n”,flavorBox.getActionCommand(),flavorBox.isSelected());
}
System.out.println(“批大小:+batchSizeCombo.getSelectedItem());
System.out.println(“VG比率:+vgRatioSpinner.getValue());
System.out.println();
}
}
私有静态void createAndShowGui(){
JuiceTwo主面板=新的JuiceTwo();
JFrame=新的JFrame(“JuiceTwo”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
}
您的代码首先需要重构,然后再做其他事情。您需要将这几十个属性封装在子组件中。这是为了你自己的理智:pA基本经验法则:对每个特定动作使用一个侦听器。@Dici我已经很久没有用Java编程了。谢谢你给我的小费,我就是这么想的。在public void actionPerformed(ActionEvent事件)
中,我有一行是JCheckBox checkBox=(JCheckBox)event.getSource()代码>这允许我设置标志并取消选中冲突复选框[在以下嵌套的IF语句中]。@HoverCraftFullOfels是否可以使用event.getSource()
返回对象的类型?