【问题标题】:Rewrite labels using methods使用方法重写标签
【发布时间】:2019-04-19 17:16:30
【问题描述】:

所以更具体地说,我希望能够执行“changeLabel(lableHere, textHere);” 但我不知道如何指定标签。 为了简化我想要的请求

public static void method1(String TextToSet){
    if(variable.isVisible()==false){
        variable.setVisible(true);
        variable.setText(TextToSet);
    }else if(variable.isVisible()==true){
        variable.setVisible(false);
    }
}
public static void method2(String TextToSet){
    if(variable2.isVisible()==false){
        variable2.setVisible(true);
        variable2.setText(TextToSet);
    }else if(variable2.isVisible()==true){
        variable2.setVisible(false);
    }
}

或我目前正在使用的:

    public static void method(String VariableIWantToChange, String TextToSet){
    if(VariableIWantToChange.equalsIgnoreCase("Variable1"){
        if(Variable1.isVisible()==false){
            Variable1.setVisible(true);
            Variable1.setText(TextToSet);
        }
        else if(Variable1.isVisible()==true){
            Variable1.setVisible(false);
        }
    }
    if(VariableIWantToChange.equalIgnoreCase("Variable2"){
        if(Variable2.isVisible()==false){
            Variable2.setVisible(true);
            Variable2.setText(TextToSet);
        }
        else if(Variable2.isVisible()==true){
            Variable2.setVisible(false);
        }
    }
}

(该方法在几个变量之后变得非常长)

相反,有一种类似这样的方法

public static void method( Labeltochange ,String TextToSet){
    if(Labeltochange.isVisible()==false){
        Labeltochange.setVisible(true);
        Labeltochange.setText(TextToSet);
    }
}

允许你通过method(LabelToChange, TextToSet);更改标签

【问题讨论】:

  • 只使用JLabel作为参数并像method(variable, "someText")一样调用它有什么问题?
  • 记录在案:A)超出我的回答,即使是“映射”方法也很可能是不好的做法。但为了真正帮助您,我们必须了解您实际打算解决的问题(去谷歌“XY 问题”)。但这可能会使您的问题“过于宽泛”。 B)因为一些新手经常忘记这一点:请不要忘记在某个时候接受答案。
  • 等一下,如果我这样做method(JComponent Label, String Text); 然后我可以使用标签参数来设置要设置文本的标签吗?编辑 - 编码格式失败:P
  • 感谢您的快速回归!

标签: java swing methods jlabel


【解决方案1】:

这里真正的要求是:您想将名称(字符串)名称映射到某个 UI 元素(可能是 JLabel,也可能是 JButton,谁在乎)。

答案:使用合适的数据结构,比如Map<String, JComponent>

只需在某个时间点填充该地图:

Map<String, JComponent> componentsByName = new HashMap<>(); ...
componentsByName.put("label1", labelA);

因此,稍后,您只需执行componentsByName.get() 即可通过“名称”检索...一个组件。然后调用您想在该对象上调用的任何方法。

换句话说:您绝对不应该从事这种 if/else 链的业务。每次你的 UI 出现新事物或元素被删除时,你都必须在无数地方更新代码。

【讨论】:

  • 你能举个例子吗?我是编码新手。
  • 我可能不应该问这个问题,因为它可能是基于意见的,但Map&lt;String, JComponet&gt; 会比method(JComponent, String) 更资源友好吗?
  • 你把你的努力放在了错误的地方。您的首要目标应该是设计一个清晰、简单的解决方案。很容易理解的东西。并改变。因为当遇到真正的性能问题时,那么,您的代码设计为易于更改和调整!说真的:你是一个新手,正在尝试一些事情来开始工作。您完全绝对不应该担心“性能”或“资源友好性”,尤其是考虑到您不了解这些术语的实际含义。请放心:驱动性能的是整体设计,而不是使用映射与 if/else。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
相关资源
最近更新 更多