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