2014-11-13 3 views
2

Я разработал следующее окно.Удалить функциональность кнопки

enter image description here

Я хочу разработать УДАЛИТЬ функциональность. При нажатии кнопки DELETE, соответствующий TextField должен быть удален из окна. Прилагается код проекта ниже - Только для кнопки Add More Files. Нажав кнопку Add More Files, еще одна кнопка TextField и DELETE создает и добавляет headerpanel. S У меня нет возможности подключить эти 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

Я хочу построить башню на луне – VedX

+4

@OpenJDK Покажите нам свой код moontower, и мы постараемся помочь. – khelwood

+0

Чтобы лучше помочь, отправьте сообщение [MCVE] (http: // stackoverflow.com/help/mcve) (минимальный полный проверяемый пример). –

ответ

2

У вас есть способ соединить их. Просто сохраните/сохраните их, например. a HashMap
где каждый Button сопоставляется с соответствующим TextField. Когда Button
получает щелчок, просто сделайте поиск в своем HashMap, потяните соответствующий TextField
и сделайте с ним все, что необходимо.

+0

Таким образом, моя декларация о кнопке и текстовом поле должна быть вне прослушивателя действий кнопки «Добавить файлы». Но в этом случае я объявляю и определяю как внутри ActionListener кнопки «Добавить больше файлов». Это было сделано, потому что «n» может потребоваться присоединение файлов. – Thush

+0

@Thush не совсем. «Карта map = новое объявление Hashmap <>()' находится за пределами области действия слушателя. Внутри 'actionPerformed()' создается новая кнопка + текстовое поле, и оба они добавляются в Hashmap: 'map.put (myButton, myTextField)'. –

+0

@Thush Создайте экземпляр HashMap на некотором «глобальном» (не воспринимайте этот буквально) уровень, например. HashMap может быть членом экземпляра. Добавьте объекты (кнопки, текстовые поля) к этому HashMap при их создании. –

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 имущества клиентов. Если значение, полученное этим запросом, не равно нулю, то удаляет обе кнопки и связанное текстовое поле из родительского контейнера, переопределяет иерархию компонентов и, наконец, упаковывает фрейм.

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(); 
    } 
}); 
Смежные вопросы