【问题标题】:how to make JButtons in java with less code?如何用更少的代码在java中制作JButtons?
【发布时间】:2014-02-28 10:55:14
【问题描述】:

我正在为个人项目创建一个程序,我最终创建了许多 JButton,它们在项目中占用了相当多的行,是否可以减少仍然产生相同数量的 JButton 的行数?

JButton button1 = new JButton("Empty"); 
JButton button2 = new JButton("Empty"); 
JButton button3 = new JButton("Empty"); 
JButton button4 = new JButton("Empty"); 
JButton button5 = new JButton("Empty"); 
JButton button6 = new JButton("Empty"); 
JButton button7 = new JButton("Empty"); 
JButton button8 = new JButton("Empty"); 
JButton button9 = new JButton("Empty"); 
JButton button10 = new JButton("Empty"); 
JButton button11 = new JButton("Empty"); 
and about 5 more

【问题讨论】:

  • 你能给我举个例子吗?
  • JButton[] btnBtns = new JButton[n];
  • +1 用于寻找更有效的解决方案:)我真的很喜欢这种思维方式;)

标签: java swing jbutton


【解决方案1】:

对于具有相似功能的重复性任务,我喜欢使用方法。大多数时候它会使代码更干净。它不会缩短您拥有的当前代码,但是在您添加侦听器或您可能想要添加的任何其他内容之后,它会。您可以将任意数量的变量传递给它。

public JButton createButton(String name, Color color) {
    JButton button = new JButton(name);
    button.setForeground(color);
    button.addActionListener(listener);
    return button;
}

然后你可以像这样多次调用它

JButton button = createButton("Hello", Color.BLUE);

总体而言,尽管这实际上是根据您如何创建组件的具体情况而定。如果你关心的是真的要缩短你的代码。你总是可以使用循环和一些数据结构来命名你的名字

String[] names = { "Hey", "Ya", "Yada" };
JButton[] buttons = new JButton[names.lenght];
for (int i = 0; i < buttons.length; i++) {
    buttons[i] = createButton(names[i], Color.BLUE);
} 

也许甚至可以看看this question的一些答案

【讨论】:

  • hi,所以前三个按钮名称变量将是 Hey、Ya 和 Yada。如果您使用第二种方法。例如,JButton Hey = new JButton();等等。
  • 不,只有按钮的文本。 但是操作命令将是"Hey"。如果您需要在代码中的其他地方访问它,您可以遍历数组并检查是否if ("Hey".equals(buttons[i].getActionCommand())) {}
  • 那么,您知道您的第一个示例,方法中的“字符串名称”参数,是按钮上的文本还是按钮的名称?
  • 是文本和actionCommand。该按钮将没有访问变量。它可以通过 actionCommand 访问。或者在侦听器中可以通过检查事件对象是否 == 到某个索引处的按钮来访问
【解决方案2】:

你可以创建带有循环的按钮

Vector<Button> lists = new Vector<Button>();

for(int i = 0 ; i < 10000 ; i++) {
  JButton button = new JButton("Empty"); 
  lists.add(button);
}

还有更多,更多……其他方式

【讨论】:

  • 这是演示...使用列表、数组列表、数组等
  • 但是我不能给每个按钮一个名字,可以吗?例如 button1、button2 等。
  • 何乐而不为,将“空”改为“按钮”+索引
  • 您可以使用JButton button = lists.get(i)访问每个按钮。
  • 你这样做是为了什么???您可以通过索引获取您的按钮,或者您可以使用 Hash 键是您的按钮名称
【解决方案3】:
JButton[] buttons = new JButton[n];

int x=0;
while(x<n){

buttons[n]= new JButton("Button");
x++;
}

虽然 n 是您想要的按钮数

编辑

如果您想为按钮 1、2、3 等按钮提供单独的名称

int x=0;
while(x<n){

buttons[n]= new JButton("Button "+(x+1));   //x+1 if you want to start from 1, because x is 0
x++;
}

【讨论】:

    【解决方案4】:
    import java.awt.Component;
    import java.awt.Container;
    
    import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class ComponentFactory {
    
      public static void main(String[] args) {
        Box box=Box.createVerticalBox();
        addAll(box, createButtons("foo", "bar", "baz")); // <----------
        JFrame f=new JFrame("Example");
        f.setContentPane(box);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
      }
    
      static void addAll(Container target, Component... all) {
        for(Component c:all) target.add(c);
      }
    
      static JButton[] createButtons(String... label) {
        final int num=label.length;
        JButton[] all=new JButton[num];
        for(int i=0; i<num; i++) all[i]=new JButton(label[i]);
        return all;
      }
    }
    

    【讨论】:

      【解决方案5】:

      正如其他人所指出的,您可以创建一个循环并向数组添加按钮,但 Java 不支持宏 [1],这似乎是您希望做的事情(即让代码过程自动化,但仍保留合理的变量名)。

      注意:虽然可以在 Java 中破解某种简单的宏格式,但我建议不要这样做。

      最好的办法是研究生成 Java 的代码生成器 - this 可能是一个很好的起点。

      为了生成代码,我只使用FreeMarker 模板。它并不完美,但它是体面的。基本上,您将拥有某种程序(Java 程序、Ant 任务等)来调用 FreeMarker 库,为它们提供模板和数据,然后生成预期的代码。

      【讨论】:

        猜你喜欢
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 2019-04-26
        • 1970-01-01
        • 2020-12-11
        相关资源
        最近更新 更多