将这段代码缩小的最佳方法是什么?

时间:2014-02-01 18:50:32

标签: java field labels

我想知道我们是否一遍又一遍地向java(在主类中)添加相同的组件并为每个组件编写单独的代码,是否可以使代码更小?例如如果我们多次添加按钮和标签,每个按钮和标签都做不同的工作,是否可以将它们放在更少的代码中,或者它是否必须像那样。

    JLabel label = new JLabel("Text1");
    label.setHorizontalAlignment(SwingConstants.CENTER);
    panel.add(label);
    JTextField field = new JTextField();
    panel.add(field);


    JLabel label1 = new JLabel("Text2");
    label1.setHorizontalAlignment(SwingConstants.CENTER);
    panel.add(label1);
    JTextField field1 = new JTextField();
    panel.add(field1);
    field1.setEnabled(false);

    JLabel label2 = new JLabel("Text3");
    label2.setHorizontalAlignment(SwingConstants.CENTER);
    panel.add(label2);
    JTextField field2 = new JTextField();
    panel.add(field2);

field2.setEnabled(false);

在我的代码中,我必须反复添加相同的组件,例如10次,但是每个组件都在做不同的工作,是否可以用更少的代码将它们放在一起?

此外,我希望能够将每个文本框的值存储在不同的变量中,例如将field1的值存储到int number;。

7 个答案:

答案 0 :(得分:1)

创建一个可以重复使用的方法:

private void method createLabel(JPanel panel, String text) {
     JLabel label = new JLabel(text);
     label.setHorizontalAlignment(SwingConstants.CENTER);
     panel.add(label);
     JTextField field = new JTextField();
     panel.add(field);
}

如果您需要额外的内容,例如setEnabled()或其他内容,只需根据要求传递参数即可。如果您需要标签,只需将void更改为JLabel并将其返回。然后你就这样称呼它

createLabel(panel, "text1");
createLabel(panel, "text2");
...

答案 1 :(得分:0)

1.Create ArrayList
2.创建JLabel添加到arraylist的方法 3.使用String名称参数
4.Profit ???

答案 2 :(得分:0)

  

“是否可以缩小代码?”

是。一种方式,正如@iberbue所建议的那样是使用一种方法。您可以使用返回JPanel并将参数传递给它的方法

看看这个例子,我正在研究另一个问题。但它有同样的目的。查看返回createPanel的方法JPanel。然后我只使用JPanel panel = createPanel(...);

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test2 {

    Map<String, JTextField> fields;
    Map<String, JLabel> labels;

    public Test2() {
        fields = new HashMap<>();
        labels = new HashMap<>();

        JPanel mainPanel = new JPanel(new GridLayout(10, 1));
        for (int i = 1; i <= 10; i++) {
            JPanel panel = createPanel("Text Field " + i);
            mainPanel.add(panel);
        }

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new Test2();
            }
        });
    }

    private JPanel createPanel(String fieldName) {
        JPanel panel = new JPanel();
        JTextField field = new JTextField(15);
        field.addActionListener(new FieldListener());
        fields.put(fieldName, field);

        JLabel label = new JLabel(fieldName);
        label.addMouseListener(new MouseHandler());
        labels.put(fieldName, label);

        JButton button = new JButton(fieldName);
        button.addActionListener(new ButtonListener());

        panel.add(label);
        panel.add(field);
        panel.add(button);

        return panel;
    }

    public class ButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton button = (JButton)e.getSource();
            String fieldName = button.getText();
            JTextField field = fields.get(fieldName);
            System.out.println(field.getText());
        }
    }

    public class FieldListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JTextField field = (JTextField)e.getSource();
            System.out.println(field.getText());
        }
    }

    public class MouseHandler extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            JLabel label = (JLabel)e.getSource();
            System.out.println(label.getText());
        }
    }
}

答案 3 :(得分:0)

你可以写一个像这样的方法。

private void add(JPanel panel, int i, boolean enabled){
    JLabel label = new JLabel("Text" + i);
    label.setHorizontalAlignment(SwingConstants.CENTER);
    panel.add(label);
    JTextField field = new JTextField();
    panel.add(field);
    field.setEnabled(enabled);
}

然后根据需要调用它3次。

答案 4 :(得分:0)

您已经注意到大多数代码都会重复出现。这是一个很好的第一步。

然后,注意迭代之间哪些部分发生了变化(语义上)(即忽略不同的变量名和其他不重要的信息):new JLabel(theLabelThatChanges).setEnabled(thisFieldEnabled)

然后,把所有这些放在一个循环中:

for(int i = 0; i < 10; i++)
{
    JLabel label2 = new JLabel(theLabelThatChanges);
    label2.setHorizontalAlignment(SwingConstants.CENTER);
    panel.add(label2);
    JTextField field2 = new JTextField();
    panel.add(field2);
    field1.setEnabled(thisFieldEnabled);
}

确保为更改的内容提供一组值:

String[] labels = new String[] { "Text1", "Text2", "Text3" };
boolean[] enabledBoxes = new boolean { true, false, true };

确保在每次迭代中获取一个值:

String theLabelThatChanges = labels[i];
boolean thisFieldEnabled = enabledBoxes[i];

最终代码:

String[] labels = new String[] { "Text1", "Text2", "Text3" };
boolean[] enabledBoxes = new boolean { true, false, true };
for(int i = 0; i < 3; i++)
{
    String theLabelThatChanges = labels[i];
    boolean thisFieldEnabled = enabledBoxes[i];

    JLabel label2 = new JLabel(theLabelThatChanges);
    label2.setHorizontalAlignment(SwingConstants.CENTER);
    panel.add(label2);
    JTextField field2 = new JTextField();
    panel.add(field2);
    field1.setEnabled(thisFieldEnabled);
}

正如其他人所评论的那样,您可以选择创建所有这些内容的部分,并将其作为一个单独的过程,将标签和启用状态作为参数:

private void addControls(String theLabelThatChanges, boolean thisFieldEnabled)
{
    JLabel label2 = new JLabel(theLabelThatChanges);
    label2.setHorizontalAlignment(SwingConstants.CENTER);
    panel.add(label2);
    JTextField field2 = new JTextField();
    panel.add(field2);
    field1.setEnabled(thisFieldEnabled);
}

然后从循环中调用它:

for(int i = 0; i < 3; i++)
{
    addControls(labels[i], enabledBoxes[i]);
}

答案 5 :(得分:0)

复杂的答案。 如果你想成为OO。

Make class CustomJButton扩展了JButton

在构造函数中设置所需的一切

如果你不打算再使用Button vars,你将能够做到这一点

    new CustomJButton("NAME");

如果您打算使用Button vars

,您将能够这样做
    CustomJButton j = new CustomJButton("NAME");

答案 6 :(得分:0)

我认为应该有一些流畅的swing GUI API ,但我没有发现任何刺激。 Java 8上的JavaFX GUI很不错。

虽然Java 8允许使用Java 7的简洁事件监听器,但也可以使用流畅的API。

JPanel panel = new FrameBuilder().panel()
    .children()
        .label("Text1")
            .setHorizontalAlignment(SwingConstants.CENTER)
        .textField()
            .setId("field1")
        .label("Text2")
            .setHorizontalAlignment(SwingConstants.CENTER)
        .textField()
            .setId("field2")
            .setEnabled(false)
    .endChildren()
    .create();

FrameBuilder.panel给出了一个PanelBuilder,其创建返回JPanel。或者是这样。