2014-02-03 4 views
0

У меня есть следующий фрагмент кода, в котором пользовательская панель добавляется в JTaskPane. На панели есть метка, которая удаляется, когда я нажимаю на нее. Однако моя пользовательская панель не удаляется. Как я могу щелкнуть крест на панели, чтобы удалить его?Как удалить компонент из JXTaskPane?

Ниже приведен снимок. Таким образом, в этом случае, я могу удалить «Закрыть» JLabel, но я не могу удалить фиолетовый ярлык, когда я нажимаю на «крест» знак

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Cursor; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

import org.jdesktop.swingx.JXTaskPane; 

public class Test { 
    private SRLSearchPanel panel = new SRLSearchPanel(); 

    class SRLSearchPanel extends JPanel { 

     private JXTaskPane filterPanel = new JXTaskPane(); 
     private JTextField searchField = new JTextField(20); 

     public SRLSearchPanel() { 
      setLayout(new BorderLayout()); 
      final JLabel lbl = new JLabel("Close"); 
      filterPanel.add(lbl); 
      lbl.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        super.mouseClicked(e); 
        filterPanel.remove(lbl); 
        filterPanel.revalidate(); 
       } 
      }); 

      filterPanel.add(searchField); 
      add(filterPanel, BorderLayout.WEST); 

      searchField.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        FilterBox filterBox = new FilterBox(searchField.getText()); 
        filterPanel.add(filterBox); 
       } 
      }); 
     } 

     public void removeFilter(FilterBox filterBox) { 
      filterPanel.remove(filterBox); 
     } 
    } 

    class FilterBox extends JPanel { 

     private static final int PADDING = 2; 
     private static final String PAD_STR = " "; 

     private JLabel filterLbl = new JLabel(); 
     private JButton closeBtn = new JButton("X"); 

     public FilterBox(String label) { 
      filterLbl.setText(PAD_STR + label + PAD_STR); 
      closeBtn.setBorderPainted(false); 
      closeBtn.setFocusPainted(false); 
      closeBtn.setContentAreaFilled(false); 
      closeBtn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
      System.err.println("Adding action listener " 
        + FilterBox.this.hashCode()); 
      closeBtn.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        panel.removeFilter(FilterBox.this); 
       } 
      }); 

      this.setLayout(new BorderLayout()); 
      this.add(filterLbl, BorderLayout.WEST); 
      this.add(closeBtn, BorderLayout.EAST); 

      this.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        super.mouseClicked(e); 
        System.err.println("Removing filter"); 
        panel.filterPanel.remove(FilterBox.this); 
       } 
      }); 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      g.setColor(new Color(0f, 0f, 1f, 0.3f)); 
      g.fillRoundRect(0, 0, this.getWidth(), this.getHeight() - PADDING, 
        20, 20); 
      g.setColor(Color.BLACK); 
     } 
    } 

    public static void main(String[] args) { 
     Test i = new Test(); 
     i.testRun(); 
    } 

    public void testRun() { 
     final JFrame frame = new JFrame(); 
     SRLSearchPanel spanel = new SRLSearchPanel(); 
     frame.add(spanel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(800, 800)); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       frame.pack(); 
       frame.setVisible(true); 
       frame.setLocationRelativeTo(null); 
      } 
     }); 
    } 
} 
+0

Как указано в [Пристальный взгляд на механизм Paint] (http://docs.oracle .com/javase/tutorial/uiswing/painting/closer.html), вы не должны переопределять метод 'paint()', а 'paintComponent()' вместо этого для практических целей. – dic19

ответ

2

у вас возникли проблемы контекста.

Сначала вы создаете переменную экземпляра SRLSearchPanel

private SRLSearchPanel panel = new SRLSearchPanel(); 

Это используется вашим FilterBox

Но затем создать еще один экземпляр ...

SRLSearchPanel spanel = new SRLSearchPanel(); 
frame.add(spanel); 

Это тот, который на самом деле на экране, поэтому взаимодействие с panel не имеет никакого эффекта, поскольку оно не имеет отношения к тому, что вы на самом деле положили на s Creen

Вместо этого, вы можете попробовать просто с просьбой о том, что FilterBox быть удалены из его родителей ...

closeBtn.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     getParent().remove(FilterBox.this); 
    } 
});