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



我想知道我们是否一遍又一遍地将相同的组件添加到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编号;。

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

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.创建arraylist
2.创建用于将Jlabel添加到arrayList
的方法3.借助字符串名称参数
4.profit ???

"可以使代码较小吗?"

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

请查看我正在为另一个问题而努力的示例。但是它具有相同的目的。查看返回JPanel的方法createPanel。然后我只使用 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());
        }
    }
}

您可以编写类似的方法。

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次。

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

然后,请注意迭代之间(即忽略不同的变量名称和其他不重要的信息)之间的零件(语义上):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]);
}

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

让类CustomJbutton扩展JButton

设置您需要的所有内容

如果您不再使用按钮vars

,您将可以执行此操作
    new CustomJButton("NAME");

如果要使用按钮vars

,您将可以执行此操作
    CustomJButton j = new CustomJButton("NAME");

我认为应该已经有一些 fluent swing gui api ,但是我在刺激上找不到任何东西。Java 8上的Javafx Gui很好。

尽管Java 8允许使用Java 7的TERSE事件听众也可以进行流利的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给出了一个面板布置器,其创建返回了jpanel。大约是。

相关内容

最新更新