从基于JTextField的选定按钮优化文本

时间:2016-09-23 18:31:03

标签: java jcheckbox

我对java很陌生,我的代码有一个小问题。代码工作得很好,但我觉得它可以改进。

以下是代码:

    if(evt.getStateChange()==1){
        String value = "-MyAppArgument ";
        String temp = CustomARG.getText();
        CustomARG.setText(temp+""+value);
        }else if(evt.getStateChange()!= 1){
        String value = "-MyAppArgument ";
    CustDEVARGSargsTextField.setText(CustDEVARGSargsTextField.getText().replace(value,""));
        }

我有4个复选框按钮,每个按钮都有一个如上所示的参数。我对优化的想法是根据选定的按钮构造一个字符串,并在实际的流程构建器中使用该字符串,但我不知道该怎么做。问题是如何优化这一点,我的想法是否合适?

2 个答案:

答案 0 :(得分:1)

来自Oracle的好例子。

StringBuffer choices;
  

四种配件选择提供16种不同的选择         组合。         "选择" StringBuffer包含字符串         表示您当前的选择。您可以更改符号上的字符(c,g,h,t)以进行处理。此外,如果您需要后缀,例如" -MyAppArgument"你可以添加它,但它必须是常量,因为我们需要一些固定索引来根据复选框的开/关切换状态来设置我们的值。

choices = new StringBuffer("cght"); // change it to your postfix


   ----             //zero accessories

   c---             //one accessory
   -g--
   --h-
   ---t

   cg--             //two accessories
   c-h-
   c--t
   -gh-
   -g-t
   --ht

   -ght             //three accessories
   c-ht
   cg-t
   cgh-

   cght             //all accessories

您可以在所有复选框上添加项侦听器:

sampleCheckBox1.addItemListener(this);
sampleCheckBox2.addItemListener(this);
sampleCheckBox3.addItemListener(this);
sampleCheckBox4.addItemListener(this);

然后倾听他们并改变"选择":

public void itemStateChanged(ItemEvent e) {
    int index = 0;
    char c = '-';
    Object source = e.getItemSelectable();

    if (source == sampleCheckBox1) {
        index = 0;
        c = 'c';
    } else if (source == sampleCheckBox2) {
        index = 1;
        c = 'g';
    } else if (source == sampleCheckBox3) {
        index = 2;
        c = 'h';
    } else if (source == sampleCheckBox4) {
        index = 3;
        c = 't';
    }

    //Now that we know which button was pushed, find out
    //whether it was selected or deselected.
    if (e.getStateChange() == ItemEvent.DESELECTED) {
        c = '-';
    }
    //Apply the change to the string.
    choices.setCharAt(index, c);
}

此外,如果您有常量字符串,只需将其添加到主代码上方,例如:

final String = "-MyAppArgument ";

答案 1 :(得分:1)

另一种选择是,而不是添加/删除参数以响应已检查的事件,而是从头开始完全重建字符串以响应每个事件。不一定"优化"但是你并不需要对它进行优化,你需要它才能运行并且可以维护。

例如,伪代码(随意使用StringBuilder,并不真的重要):

void updateParameterString () {
   String parameterString = ""; // constant params can be initialized here too
   if (checkbox1 is checked) parameterString += " -arg1";
   if (checkbox2 is checked) parameterString += " -arg2";
   if (checkbox3 is checked) parameterString += " -arg3";
   if (checkbox4 is checked) parameterString += " -arg4";
   CustDEVARGSargsTextField.setText(parameterString); // option: trim the string
}

void onAnyCheckButtonStateChange () {
   updateParameterString();
}

这种方法的另一个优点是你可以例如使用具有相同代码的复选框的初始默认值初始化参数字符串文本框,例如,在创建复选框时设置检查状态,然后在显示表单时调用updateParameterString()

上述的其他排列当然是可能的,这取决于最合适的,例如,用一个只生成并返回字符串的方法替换updateParameterString(),然后在正确的位置使用它。