我想知道我们是否一遍又一遍地向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;。
答案 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。或者是这样。