- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道如果我们一次又一次地将相同的组件添加到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);
JLabel label2 = new JLabel("Text3");
label2.setHorizontalAlignment(SwingConstants.CENTER);
panel.add(label2);
JTextField field2 = new JTextField();
panel.add(field2);
在我的代码中,我必须一遍又一遍地添加相同的组件,例如 10 次,但每个组件都在做不同的工作,是否可以用更少的代码来包含它们?
编辑:
String[] labelNames = {"label1", "label2", "label3",};
String[] fieldNames = {"Name1", "Name2", "Name3",};
String[] labelTexts = {"Text1", "Text2", "Text3"};
Map<String, JTextField> fieldMap = new HashMap<>();
// for loop here to add JLabels
for (String text : labelTexts) {
for (int i = 0; i < fieldNames.length; i++) {
for (int j = 0; j < labelNames.length; j++) {
JLabel labelNames = new JLabel(text);
panel.add(labelNames);
JTextField fieldName = new JTextField(10);
panel.add(fieldName);
fieldMap.put(text, fieldName);
}
}
}
最佳答案
使用集合或数组以及循环来简化事情:
String[] labelTexts = {"Text1", "Text2", "Text3"};
Map<String, JTextField> fieldMap = new HashMap<>();
// for loop here to add JLabels
for (String text : labelTexts) {
JLabel label = new JLabel(text);
panel.add(label);
JTextField field = new JTextField(10);
panel.add(field);
fieldMap.put(text, field);
}
例如,我在本例中使用了上述类型的代码:
class PlayerEditorPanel extends JPanel {
enum FieldTitle {
NAME("Name"), SPEED("Speed"), STRENGTH("Strength");
private String title;
private FieldTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
};
private static final Insets WEST_INSETS = new Insets(5, 0, 5, 5);
private static final Insets EAST_INSETS = new Insets(5, 5, 5, 0);
private static final double SCALE = 0.4;
private Map<FieldTitle, JTextField> fieldMap = new HashMap<FieldTitle, JTextField>();
private BufferedImage backgroundImg = null;
private int imgWidth;
private int imgHeight;
public PlayerEditorPanel(BufferedImage img) {
this.backgroundImg = img;
imgWidth = (int) (backgroundImg.getWidth() * SCALE);
imgHeight = (int) (backgroundImg.getHeight() * SCALE);
setLayout(new GridBagLayout());
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Player Editor"),
BorderFactory.createEmptyBorder(5, 5, 5, 5)));
GridBagConstraints gbc;
for (int i = 0; i < FieldTitle.values().length; i++) {
FieldTitle fieldTitle = FieldTitle.values()[i];
gbc = createGbc(0, i);
JLabel fieldLabel = new JLabel(fieldTitle.getTitle() + ":",
JLabel.LEFT);
fieldLabel.setForeground(new Color(200, 10, 10));
fieldLabel.setFont(fieldLabel.getFont().deriveFont(Font.BOLD, 24f));
add(fieldLabel, gbc);
gbc = createGbc(1, i);
JTextField textField = new JTextField(10);
add(textField, gbc);
fieldMap.put(fieldTitle, textField);
}
}
@Override
@Transient
public Dimension getPreferredSize() {
if (backgroundImg != null) {
return new Dimension(imgWidth, imgHeight);
}
return super.getPreferredSize();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (backgroundImg != null) {
g.drawImage(backgroundImg, 0, 0, imgWidth, imgHeight, this);
}
}
private GridBagConstraints createGbc(int x, int y) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST;
gbc.fill = (x == 0) ? GridBagConstraints.BOTH
: GridBagConstraints.HORIZONTAL;
gbc.insets = (x == 0) ? WEST_INSETS : EAST_INSETS;
gbc.weightx = (x == 0) ? 0.1 : 1.0;
gbc.weighty = 1.0;
return gbc;
}
public String getFieldText(FieldTitle fieldTitle) {
return fieldMap.get(fieldTitle).getText();
}
}
在此答案中:How to align multiple textfields on a background image within a JOptionPane?
<小时/>编辑
您在评论中指出:
I have used a JFrame.
编辑2
你问:
So the name of each label and field we are adding through for loop will be named as label1, label2 etc. and field1, field2 etc. Is it possible to change the name of each field/label to something different e.g. instead of field 1, 2, 3 have number, string and double etc and for label, instead of label 1, 2 and 3 have numanswer, stringanswer, doubanswer etc.
当然,您可以使用任何您想要的名称。数字标签并没有什么魔力。
how can I get the text of individual textfield and set it to different variables? e.g. first textfield to a variable firstnumber, second textfield to userinput and so on.
我从来没有明白代码的真正关键是什么——我使用 Map 将 JTextField 与另一个对象(例如 String 或枚举)关联起来,通过这样做,可以轻松提取 JTextField 所保存的文本JTextField 使用字符串或枚举作为键。
例如,在我的后一个示例中,我使用名为 FieldTitle 的三个项目的枚举(项目数可以是任何值),并使用该枚举来创建我的 JLabel 文本并作为键到每个关联的 JTextField 的映射。我使用 for 循环来循环遍历枚举项数组(由枚举 values()
方法保存),在该循环中,我创建 JLabel 和 JTextField,使用以下命令将它们添加到我的 JPanel 中: GridBagLayout 使数据显示为表格,每个标签文本字段对组成表格的一行。然后,我使用枚举作为键将新创建的 JTextField 添加到 Map:fieldMap.put(fieldTitle, textField);
。然后,当任何外部类想要提取 JTextField 保存的文本时,它们只需调用 getFieldText
方法,传入适当的枚举,并获取其字符串。
关于java - 是否可以让你添加到java中的组件的代码变得更小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498988/
我有一个功能是转换 ADO Recordset 进入html: class function RecordsetToHtml(const rs: _Recordset): WideString; 该函
经过几天的研究和讨论,我想出了这种方法来收集访客的熵(你可以看到我的研究历史here) 当用户访问时,我运行此代码: $entropy=sha1(microtime().$pepper.$_SERVE
给定一个无序列表 List ,我需要查找是否存在 String与提供的字符串匹配。 所以,我循环 for (String k : keys) { if (Utils.keysM
我已经搜索过这个问题,但没有找到我正在寻找的答案。 基本上,我想将类构造函数包装在 try/except 子句中,以便它忽略构造函数内特定类型的错误(但无论如何都会记录并打印它们)。我发现做到这一点的
我有一组三个数字,我想将一组数字与另一组数字进行比较。即,第一组中的每个数字小于另一组中的至少一个数字。需要注意的是,第一组中的下一个数字必须小于第二组中的不同数字(即,{6,1,6} 对 {8,8,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
首先介绍一下背景: 我正在开发一个带有 EJB 模块和应用程序客户端模块的企业应用程序 (ear)。我还使用 hibernate JPA 来实现持久性,并使用 swingx 来实现 GUI。这些是唯一
我正在尝试在我的上网本上运行 Eclipse 以便能够为 Android 进行开发。 您可能已经猜到了,Eclipse 非常慢,并且不容易有效地开发。 我正在使用 Linux Ubuntu 并且我还有
for row, instrument in enumerate(instruments): for col, value in enumerate(instrument):
return not a and not b ^ 我如何以更好的格式表达它 最佳答案 DeMorgan's Law , 也许? return not (a or b) 我认为在这一点上已经足够简单了
我正在尝试让 Font Awesome 图标看起来更 slim https://jsfiddle.net/cliffeee/7L6ehw9r/1/ . 我尝试使用“-webkit-text-strok
假设我有一个名为 vals 的数据框,如下所示: id…………日期…………min_date…… .........最大日期 1…………2016/01/01…………2017/01/01…………2018/
是否有更 Pythonic 的方式来做到这一点?: if self.name2info[name]['prereqs'] is None: se
我有一个函数可以将一些文本打印到它接收到的 ostream&。如果 ostream 以终端为目标,我想让它适应终端宽度,否则默认为某个值。 我现在做的是: 从 ostream 中获取一个 ofstre
这个问题在这里已经有了答案: Should a retrieval method return 'null' or throw an exception when it can't produce
我有这个 bc = 'off' if c.page == 'blog': bc = 'on' print(bc) 有没有更 Pythonic(和/或更短)的方式在 Python 中编写? 最佳
输入:一个包含 50,000 行的 CSV;每行包含 910 列值 0/1。 输出:运行我的 CNN 的数据框。 我编写了一个逐行读取 CSV 的代码。对于每一行,我将数据分成两部分,称为神经元(90
据我所知,with block 会在您退出 block 后自动调用 close(),并且它通常用于确保不会忘记关闭一个文件。 好像没有技术上的区别 with open(file, 'r+') as f
我有一个使用 Entity Framework V6.1.1 的 MVC 5 网站。 Entity Framework DbContext 类和模型最初都在网站项目中。这个项目有 3 个 DbCont
我是编程新手,在尝试通过将 tableView 和关联 View 的创建移动到单独的类并将委托(delegate)和数据源从 VC 移动到单独的类来精简我的 ViewController 时遇到了一些
我是一名优秀的程序员,十分优秀!