【问题标题】:Declare multiplie swing elements at once一次声明多个摆动元素
【发布时间】:2017-05-15 20:32:49
【问题描述】:

我正在开发一个小游戏,一个 IT 类的 Java 项目。

添加/声明(???) Java swing 元素我用过这种写法:

JLabel A = new JLabel();
JLabel B = new JLabel();
//More JLabels...


JButton A = new JButton();
JButton B = new JButton();
//More JButtons...

为了代码不会变得更长和(更)混乱,我继续写这种类型的文章:

JLabel A = new JLabel(), B = new JLabel()/*More JLabels...*/;

JButton A = new JButton(), B = new JButton()/*More JButton...*/;

/*Generaly more comments everywhere over the code for my teacher (and me)
 *and more for a better overview.
 */

我的问题是:

有没有更短的方法一次添加/声明(???) 多个 Java swing 元素?

//like this
JLabel A, B, C, D, E, F = new JLabel();
//or
new JLabel[A, B, C, D, E, F];//PLS don't ask what I'm doing in this line xD

或者可能在 Stackoverflow 中已经有一个我没有找到的半问题?

编辑

这个问题在这里可能已经有了答案:Initializing multiple Java 6答案中的变量为相同的值

这里是Link 问题

您的问题已被确定为可能与另一个问题重复 题。如果那里的答案不能解决您的问题,请 编辑以详细解释您的问题中独特的部分。

不适用于 Jbuttons 和 JLabels。

【问题讨论】:

  • 小心投票者,他们喜欢这种问题!
  • 但是,如果您不关心 JLabel 对象的 Name,您可以创建一个 ArrayList<JLabel> 并循环遍历它,在您添加和初始化的每个循环中匿名标签new JLabel()
  • stackoverflow.com/questions/6202818/… 这个问题应该对你有帮助;同时解释为什么你不应该;)它可以做得更短,但你所有的字段都会指向完全相同的对象。
  • 您要求人们对风格发表意见。这是您的问题可能引起负面关注的两个原因。该论坛的章程主要将其限制为以下问题:“为什么这个技巧不起作用......?或者这个错误消息是什么意思......?”你可能在softwareengineering.stackexchange.com 上运气更好,他们更愿意谈论设计模式和“最佳实践”等等。

标签: java swing declare


【解决方案1】:

如果您使用的是 Java 8,则可以使用:

List<String> labels = ....;
Stream<Button> stream = labels.stream().map(Button::new);
List<Button> buttons = stream.collect(Collectors.toList());

来自书Java se 8 for the really impatient


然后你可以使用:

JPanel p = new JPanel();
buttons.forEach((t) -> p.add(t));//add your buttons to your panel

【讨论】:

  • 你的答案总是很精彩:)
【解决方案2】:

这取决于,如果您的所有对象都是JLabel 或相同的对象类型,您可以尝试:

  • JLabel 的数组,例如:

    JLabel[] labels = new JLabel[size of your array];
    

    然后在 for 循环内访问它:

    for (int i = 0; i < labels.length; i++) {
        labels[i] = new JLabel("I'm label: " + i);
    }
    
  • 标签List

    ArrayList <JLabel> labelsList = new ArrayList <JLabel>();
    

    那么你可以:

    for (int i = 0; i < 10; i++) { //I take 10 as an arbitrary number just to do it in a loop, it could be inside a loop or not
        labelsList.add(new JLabel("I'm label-list: " + i));
    }
    

然后你可以像这样添加它们:

pane.add(labels[i]); //Array
pane.add(labelsList.get(i)); //List

上述代码应在循环内或更改i 以获得要添加的元素的显式索引。

【讨论】:

    【解决方案3】:

    如果你想在一个程序中多次做同样的事情(或类似的事情),答案是使用某种循环。在这里,你可以声明一个 JButton 元素的数组(或 List),然后循环遍历它来初始化它的元素:

    final int NUM_BUTTONS = 6;
    JButton[] buttons = new JButton[NUM_BUTTONS];
    for (int i = 0; i < NUM_BUTTONS; i++) {
      buttons[i] = new JButton();
    }
    
    // refer to A as buttons[0], C as buttons[2], etc
    

    【讨论】:

      【解决方案4】:

      您可以在声明变量后使变量彼此相等。

      String one, two, three;
      one = two = three = "";
      

      所以,我认为你可以这样做

      JLabel A,B,C,D,E,F;
      A = B = C = D = E = F = new JLabel();
      

      【讨论】:

      • 请注意,所有这些变量都指向完全相同的 JLabel,这肯定不是预期的。
      • @Yahya 可以,但它对普通对象不是很有用。不过,对于原始类型,它是完全有效的
      • 那没有意义,一二三和JLabel初始化指向同一个对象的目的是什么。
      • @Yahya 如果您告诉我们究竟是什么不起作用,那将会有所帮助。我把这两行放在正确的地方,效果很好,唯一的问题是所有六行都指向同一个 JLabel()。
      • @MalteHartwig 我认为这是我回答的问题。由于它们都指向彼此,因此对其属性的任何更改都会影响它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多