2015-07-17 5 views
0

У меня есть главный JPanel, который называется board, у которого есть еще один JPanel в нем с двумя `JButtons ', один из которых должен удалить эту панель при нажатии.JButton занимает 2 клика

public class AditWindow extends JPanel { 
    private int width; 
    private int height; 

public AditWindow(int x, int y){ 
     super(); 
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     width=180; 
     height=60; 
     setBounds(x, y, width, height); 
     JButton addLoc = new JButton("Add Location"); 
     JButton addSign = new JButton("Add Sign"); 
     addLoc.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       close(); 
       System.out.println("click"); 
      } 
     }); 
     addSign.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("addSign"); 
      } 
     }); 
     Main.font=Main.font.deriveFont(13f); 
     addLoc.setFont(Main.font); 
     addSign.setFont(Main.font); 
     addLoc.setMaximumSize(new Dimension(width, 30)); 
     addSign.setMaximumSize(new Dimension(width, 30)); 
     addLoc.setBackground(new Color(0xF6F6F6)); 
     addSign.setBackground(new Color(0xF6F6F6)); 
     add(addLoc); 
     add(addSign); 
     Main.board.validate(); 

private void close(){ 
     System.out.println("close"); 
     Main.board.del(this); 
     } 
} 

ДЭС метод:

public void del(Component c){ 
     remove(c); 
     validate(); 
     System.out.println("removed"); 
     } 

Проблема: по какой-то причине он занимает 2 кликов на панели, чтобы удалить, но линии получить напечатанный на обоих щелчками. Я не уверен, как правильно управлять этой ситуацией.

EIDT: Если я удалю строку validate() из метода del(), она будет работать с первого щелчка, но только кнопки будут исчезать, оставляя на экране прямоугольник фона JPanel.

+0

Значит, как «закрыть», так и «щелкнуть» распечатать? – SomeStudent

+0

@Ageoffan Да, на оба клика он печатает: закрыть удален клик – seMikel

+0

Не могу сказать, что у меня когда-либо была такая проблема, попробуйте, возможно, сделать this.c в методе close? – SomeStudent

ответ

0

Возможно, вы попытаетесь вызвать удаление/проверку в вызове SwingUtilities.invokeLater().

+0

Так что-то вроде этого: 'общественная пустота дель (конечный компонент с) { SwingUtilities.invokeLater (новый Runnable() { общественного недействительными запуска() { удалить (с); Validate(); System.out.println («удалено»); } }); } ' ? – seMikel

+0

Да, это правильно. Также может быть проблема, которую вы вызываете validate(). Возможно, вам понадобится revalidate(). Или даже перерисовать() .. Проверьте это для получения дополнительной информации: https://stackoverflow.com/questions/1097366/java-swing-revalidate-vs-repaint – crig

0

попробуйте передать AditWindow.this в метод Main.board.del() вместо этого.

+0

По-прежнему требуется второй щелчок – seMikel

Смежные вопросы