删除按钮功能

时间:2014-11-13 11:18:36

标签: java swing

我开发了以下窗口。

enter image description here

我想开发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();
                }
            }
        });

2 个答案:

答案 0 :(得分:2)

你有办法连接它们。只需将它们保存/存放在例如HashMap 其中每个Button都映射到其对应的TextField。当Button
点击一下,只需在HashMap中进行查找,然后点击相应的TextField 并随心所欲地做任何事情。

答案 1 :(得分:1)

IMO这是一个很好的用例,用于合并ActionsetClientProperty(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();
    }
});