2011-05-26 14 views
6

Alt panelleri, ana panellerimden görünmez olacak şekilde alt panellerden birini ayarladığım zaman nerede kalıyorum? Ben panel3.setVisible(false) yaptığınızda o zaman benziyorSetVisible (false) benim Panelimin içindeki bileşenlerin düzenini değiştiriyor

[ (Panel1) (Panel2) (Panel3) (Panel4) ] 

:

[ (Panel1) (Panel2)   (Panel4) ] 

Ben:

[  (Panel1) (Panel2) (Panel4)  ] 

nasıl bir şey bakmak istiyorum gibi

Ne var görünüyor GridBagLayout ve mainPanel deklarasyonunu kullanarak şu gibi görünüyor:

Gerekirse ben daha fazla kod vereceğiz ve ben sürece beni alır gibi İstediğimi kullanan düzen umurumda değil

final JTextField valueTextField = new JTextField(); 
valueTextField.setPreferredSize(new Dimension(80, 25)); 
valueTextField.setName("Value"); 
c.gridx =0; 
panel.add(valueTextField, c); 

:

final JPanel panel = new JPanel(new GridBagLayout()); 
GridBagConstraints c = new GridBagConstraints(); 

ve ben gibi bir yeni bir panel ekleyin.

cevap

6

Tek tek hücreler içinde CardLayout kullanmanızı öneririm ve görünmez olarak ayarlamak yerine, Bunun yerine boş bir panel.

Aşağıdaki kod bunu göstermektedir. hidePanel() içinde, şu anda etkin olan CardLayout rotası ile hücreyi gizlemek için iki seçenek vardır.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class InvisiblePanels { 
    public static void main(String... args) throws Exception { 
     JFrame frame = new JFrame(); 
     frame.setLayout(new GridBagLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     GridBagConstraints c = new GridBagConstraints(); 
     c.gridx = 0; 
     frame.add(new MyPanel(), c); 
     c.gridx = 1; 
     frame.add(new MyPanel(), c); 
     c.gridx = 2; 
     frame.add(new MyPanel(), c); 

     frame.pack(); 
     frame.setVisible(true); 

    } 

    private static class MyPanel extends JPanel { 

     CardLayout layout; 

     public MyPanel() { 
      layout = new CardLayout(); 
      setLayout(layout); 
      JButton button = new JButton("Click me"); 
      button.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        hidePanel(); 
       } 
      }); 
      add(button, "visible"); 
      add(new JPanel(), "invisible"); 
      layout.show(this, "visible"); 
     } 

     public void hidePanel() { 
//   setVisible(false); 
      layout.show(this, "invisible"); 
     } 
    } 
} 
2

Sen GridLayout çimdik mümkün olabilir (bir SSCCE var mı?)

Aksi halde: Eğer GridBagLayout eklemek tek panelde bir araya Panel3 ve Panel4 koyun

. Ardından yeni Panel'i FlowLayout gibi bir Layout'ta (tercih edilen boyutta Left lefted), BorderLayout, GridLayout, vb. Olarak ayarlayın.

4

tüm düzen yöneticisi bir bileşenin görünürlüğünü saygı ve tercih edilen boyutu ve düzeni hesaplamalarında görünmez bileşenleri içermez inanıyoruz.

bir çözüm OverlayLayout kullanarak bir panelde tüm panelleri sarmak için olabilir: "tüm düzen saygı görünürlüğü" hakkında açıklama sadece kısmen doğru olduğunu

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class OverlayLayoutInvisible 
{ 
    public static void main(String[] args) 
    { 
     JPanel panel = new JPanel(); 
     panel.add(createPanel("Button 1")); 
     panel.add(createPanel("Button 2")); 
     panel.add(createPanel("Button 3")); 
     panel.add(createPanel("Button 4")); 
     panel.add(createPanel("Button 5")); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static JPanel createPanel(String text) 
    { 
     JButton button = new JButton(text); 
     button.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       Component c = (Component)e.getSource(); 
       c.setVisible(false); 
      } 
     }); 

     InvisibleComponent ic = new InvisibleComponent(button); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new OverlayLayout(panel)); 
     panel.add(ic); 
     panel.add(button); 


     return panel; 
    } 

    public static class InvisibleComponent extends JComponent 
    { 
     private Component master; 

     public InvisibleComponent(Component master) 
     { 
      this.master = master; 
      setAlignmentX(master.getAlignmentX()); 
      setAlignmentY(master.getAlignmentY()); 
     } 

     public Dimension getPreferredSize() 
     { 
      return master.getPreferredSize(); 
     } 
    } 
} 
+0

Not. Bazı Layouts'un bu durumda davranışlarla ilgili seçenekleri vardır (MigLayout'un sahip olduğu ve GroupLayout'un da sahip olduğunu düşünüyorum). DesignGridLayout, bileşenlerin görünürlüğünü önemsemez: eklenen bileşenler, aynı şekilde görünür veya görüntülenmez. – jfpoilpret

+0

+1 Renk beni aptalca vurdu. JavaDocs'ı kontrol edene kadar özel bir düzenden söz ettiğinizi sanmıştım! Dokümanlar. tanıtıldı ne zaman, '@ beri' etiketleri ile biraz ince? –

+1

@Andrew Thompson, hatırlayabildiğim kadarıyla oradaydı, ama bunu hiçbir zaman yararlı buldum. Farklı boyutlarda olduklarında paneldeki bileşenleri nasıl konumlandırdığını anlamakta sorun yaşıyorum. Ayrıca, bileşenleri nasıl katmanladığınıza dikkat etmelisiniz. Örneğin, bir düğmenin üzerine bir etiket koyarsanız. Düğme, fare faresi olayına geçtiği ve düğmenin rollover etkisini boyadığı için, bir farenin üzerindeki bir etiketin üstüne basacaktır. – camickr

İlgili konular