2013-04-11 11 views
0

У меня проблема со стеклом. Когда я впервые показываю свою панель, все в порядке. Но когда я хочу перерисовать эту панель, потому что компоненты должны меняться (метод createPanel()), тогда стеклянная панель исчезает. Когда я изменяю размер кадра, он снова становится видимым. Я понятия не имею, почему это происходит моя панель выглядит следующим образом:Стеклопанели исчезают после перекраски

package GUI; 

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class TurnajPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private GridBagConstraints c = new GridBagConstraints(); 
    private JFrame frame; 

    public TurnajPanel(JFrame frame) throws Exception { 
     this.frame = frame; 
     createPanel(); 
    } 

    public void createPanel() throws Exception { 
     removeAll(); 
     setLayout(new GridBagLayout()); 

     addMenu(); 

     revalidate(); 
     repaint(); 
    } 

    private void addMenu() { 
     JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 20)); 
     panel.setBorder(BorderFactory.createTitledBorder("aaaaaaaaaaaaaa")); 
     JPanel innerPanelTlacidiel = new JPanel(new GridBagLayout()); 
     panel.add(innerPanelTlacidiel); 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 1; 
     c.gridy = 0; 
     c.weighty = 0; 
     c.anchor = GridBagConstraints.FIRST_LINE_END; 
     c.insets = new Insets(0, 5, 0, 0); 
     final JPanel panelTlacidiel = new JPanel(new GridLayout(0, 1, 5, 5)); 
     innerPanelTlacidiel.add(panelTlacidiel, c); 
     frame.setGlassPane(panel); 
     frame.getGlassPane().setVisible(true); 

    } 

    public static void main(String[] args) throws Exception { 

     JFrame frame = new JFrame(); 
     final TurnajPanel turnaj = new TurnajPanel(frame); 
     JScrollPane scrolovaciPanel = new JScrollPane(turnaj); 
     frame.add(scrolovaciPanel); 

     frame.setSize(new Dimension(400, 400)); 
     frame.setVisible(true); 
     frame.addKeyListener(new KeyListener() { 

      @Override 
      public void keyTyped(KeyEvent e) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       System.out.println("????????????????"); 
       try { 
        turnaj.createPanel(); 
       } catch (Exception e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } 

      @Override 
      public void keyPressed(KeyEvent e) { 
       // TODO Auto-generated method stub 

      } 
     }); 
    } 
} 

, когда я добавить одну строку в метод createPanel()

public void createPanel() throws Exception { 
    removeAll(); 
    FrameFactory.turnajFrame.getGlassPane().setVisible(false); // new line 
    setLayout(new GridBagLayout()); 

    addMenu(); 

    revalidate(); 
    repaint(); 
} 

затем он работает как шарм. Может ли кто-нибудь объяснить мне такое поведение?

+0

Что именно вы хотите сделать стеклянное стекло? – MadProgrammer

+0

В стеклянном окне есть меню? Но почему вы хотите это знать. – hudi

+0

Попробуйте выяснить, что вы пытаетесь сделать. – MadProgrammer

ответ

1

Если вы просто добавили frame.revalidate() после frame.getGlassPane().setVisible(true), это сработает.

+0

hm Может быть, я действительно ослеп, но у рамки этого метода нет – hudi

+0

@hudi он появился только в Java7. Вместо этого вызывается 'frame.getRootPane(). Revalidate();' –

+0

, но frame.validate() тоже помогает. Но я все еще не понимаю, почему стеклянное стекло исчезает. Я вызываю removeAll на панели, которую я хочу добавить в фрейм. В этой панели я также создаю меню, которое я хочу установить на стеклянную панель кадра, но я не удаляю его. Вероятно, я просто не знаю, что делает removeAll точно – hudi

1
  • должно быть

    1. frame.rootPane.setGlassPane()

    2. добавить к LayoutManager GlassPane или переопределить GetPreferredSize для JPanel

  • не должно быть

    1. KeyListener в JFrame, JFrame по missine умолчания уведомителей в API для KeyEvents

    2. почему вы перегружать пустоту (ы), создавать родительские JPanel как локальные переменные,

    3. почему вы перегружать пустоту (s) , ребенок JPanel должен создать только один момент времени, а затем играть только с SetVisible (истина/ложь), сбросить значение в JComponents на SetVisible (ложной)

  • see my question

+0

Почему мне нужно добавить layoutManager? default - поток, и я доволен им. Я добавляю KeyListner только для краткого примера. Я не использовал его. – hudi

+0

просто кстати. Что следует использовать вместо KeyListener? KeyStroke? – hudi

+0

использовать KeyBindings, а не вместо KeyListener, использовать это exclusivelly :-) – mKorbel

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