我开发了以下窗口。
我想开发DELETE功能。单击DELETE按钮时,应从窗口中删除相应的TextField。
我将附上下面的设计代码 - 仅适用于Add More Files
按钮操作。
单击Add More Files
按钮时,另一个TextField和DELETE按钮正在创建并添加到headerpanel
。我无法连接这些TextField和Button(在同一行中)。我知道这不是开发这种类型窗口的正确格式。
如何设计(或重新设计)以满足DELETE功能?
Add More Files
行动代码:
cAttach.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt)
{
File file = null;
int returnVal = fc.showOpenDialog(EMailDialog.this);
if ((returnVal == javax.swing.JFileChooser.APPROVE_OPTION))
{
attachments.add(fc.getSelectedFile());
file = fc.getSelectedFile();
fieldPosition += 5;
CTextField cFileNew = new CTextField();
headerPanel.add(cFileNew, new GridBagConstraints(0, fieldPosition,
5, 1, 0.0, 0.0, GridBagConstraints.EAST,
GridBagConstraints.HORIZONTAL, new Insets(7, 80, 5,
185), 0, 0)); // Text field
//thush
CButton cDelete= new CButton("Delete");
headerPanel.add(cDelete, new GridBagConstraints(0, fieldPosition , 5,
1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE,
new Insets(7, 425, 5, 105), 0, 0)); // thush
cFileNew.setText("" + file);
listOfTextFields.add(cFileNew);
headerPanel.updateUI();
mainPanel.updateUI();
}
}
});
答案 0 :(得分:2)
你有办法连接它们。只需将它们保存/存放在例如HashMap
其中每个Button
都映射到其对应的TextField
。当Button
点击一下,只需在HashMap
中进行查找,然后点击相应的TextField
并随心所欲地做任何事情。
答案 1 :(得分:1)
IMO这是一个很好的用例,用于合并Action和setClientProperty(key, value) / getClientProperty(key),以便尽可能地对动作本身进行匿名化。
让我解释一下:每次附加新文件时都需要添加一对文本字段删除按钮,对吧?按下删除按钮时要执行的操作始终相同:从其父容器中删除按钮和关联的文本字段(我猜它是headerPanel
)。这就是我要做的事情:
1)按如下方式定义单个和共同的操作。此操作应附加到所有删除按钮。
final Action deleteAction = new AbstractAction("Delete") {
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton)e.getSource();
JTextField textField = (JTextField)button.getClientProperty("AssociatedTextField");
if (textField != null) {
JComponent parentContainer = (JComponent)button.getParent();
parentContainer.remove(button);
parentContainer.remove(textField);
parentContainer.revalidate();
parentContainer.repaint();
SwingUtilities.windowForComponent(parentContainer).pack();
}
}
};
正如您所看到的,此操作旨在附加到按钮并查找AssociatedTextField
客户端属性。如果此请求检索的值不为null,则从父容器中删除按钮和关联的文本字段,重新验证组件层次结构,最后打包框架。
2)要使前面的代码正常工作,您必须将文本字段添加到按钮客户端属性映射中,如下所示:
cAttach.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
...
CTextField cFileNew = new CTextField();
...
CButton cDelete = new CButton(deleteAction);
cDelete.putClientProperty("AssociatedTextField", cFileNew);
...
}
});
请注意,该按钮是使用上一步中定义的操作创建的。
3)最后,您不必调用updateUI
(此方法不会按照您的想法执行),而是重新验证组件层次结构并打包框架以反映更改:
cAttach.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
...
headerPanel.revalidate();
headerPanel.repaint();
SwingUtilities.windowForComponent(headerPanel).pack();
}
});