2013-10-02 3 views
4

У меня есть много jPanel (panelF), которые добавляются в другой jPanel (panelB). jPanelF содержит jPanelC. enter image description hereизменение размера качели при исчезновении JPanel

Я поставил макет, чтобы добавить их следующим образом:

PanelB.setLayout(new BoxLayout(this.PanelB, BoxLayout.PAGE_AXIS)); 
    PanelF panelF1 = new PanelF(); 
    PanelB.add(panelF1); 
    PanelF panelF2 = new PanelF(); 
    PanelB.add(panelF2); 

Я установил видимый ложна в jPanelC1. Но JPanelF2 сохраняет расстояние и не хочет делать это пустое пространство

enter image description here Я хочу, чтобы при исчезновении JPanelC1. Расстояние поддерживается между jPanelF и не будет пробелом. Я попытался проверить() и изменить макет, но я терпит неудачу. Каким будет? спасибо. Извините за мой английский

знаю, есть ли что-то вроде $ ("# panelC1"). FadeOut ("slow")? было бы идеальным.

+0

Я думаю, что это как 'работает BoxLayout' ... – MadProgrammer

+1

Лично я хотел бы попробовать с помощью' VerticalLayout' из SwingX – MadProgrammer

+0

Это макет должен использовать то? Я думаю использовать список, потому что не работал какой-либо макет. – user60108

ответ

3

Это демонстрация вертикального расположения, а не aswer за сказать

Исходя из того, как я вас понимаю проблему, VerticalLayout может быть предпочтительным решением ...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.LineBorder; 
import org.jdesktop.swingx.VerticalLayout; 

public class VerticalLayoutTest { 

    public static void main(String[] args) { 
     new VerticalLayoutTest(); 
    } 

    public VerticalLayoutTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 

      setLayout(new VerticalLayout()); 

      JPanel outter = new JPanel(new BorderLayout()); 
      outter.setBorder(new LineBorder(Color.BLACK)); 
      outter.add(new JLabel("Outter 1"), BorderLayout.NORTH); 
      JPanel inner = new JPanel(new GridBagLayout()); 
      inner.setBackground(Color.GREEN); 
      inner.add(new JLabel("Inner 1")); 
      outter.add(inner); 
      add(outter); 

      inner.addMouseListener(new MouseAdapter() { 

       @Override 
       public void mouseClicked(MouseEvent e) { 
        Component component = e.getComponent(); 
        component.setVisible(false); 
        component.invalidate(); 
        component.validate(); 
        revalidate(); 
        repaint(); 
       } 

      }); 

      add(Box.createVerticalGlue()); 

      outter = new JPanel(new BorderLayout()); 
      outter.setBorder(new LineBorder(Color.BLACK)); 
      outter.add(new JLabel("Outter 1"), BorderLayout.NORTH); 
      inner = new JPanel(new GridBagLayout()); 
      inner.setBackground(Color.GREEN); 
      inner.add(new JLabel("Inner 1")); 
      outter.add(inner); 
      add(outter); 

     } 
    } 
} 
+1

большое спасибо за ваше время. Мне удалось сделать – user60108

+0

+1 для [sscce] (http://sscce.org/) _and_ анимированного GIF! – trashgod

0

Если я правильно понял вас, вы хотите, чтобы panelF1 поддерживал его размер, когда панель внутри него скрыта. Это можно сделать несколькими способами. В зависимости от того, как настроен ваш макет, вы можете позвонить setMinimumSize() на панели F1 и убедиться, что его минимальный размер немного больше, чем размер панели PanelC1.

Более гибкий (и, вероятно, более подходящий) способ сделать это, однако, осуществляется через сам менеджер компоновки. Прочитайте tutorial on BoxLayout, и если он не делает то, что вы хотите, попробуйте использовать другой менеджер макетов. Оба GroupLayout и GridBagLayout очень гибкие, но их также сложно управлять. Недавно я стал поклонником MigLayout.

EDIT

ОК, думаю, я неправильно понял ваш вопрос из-за того, как расположение картинок и текста закончилось. На самом деле это проще, чем я думал. Посмотрите на учебник BoxLayout я связан - то, что я думаю, что вы ищете это:

PanelB.add(panelF1); 
PanelB.add(Box.createVerticalGlue()): 
PanelB.add(panelF2); 
+0

Нет, я хочу уменьшить расстояние между JPanelF1 и JPanelF1. спасибо – user60108

3

Вызов panelC1.setVisible(false) делает panelC1 невидимым, но это не меняет геометрию, определяемую get[Preferred|Maximum|Minimum]Size методами. Вы можете

  • Переопределите методы определения, как показано на рисунке How to Use BoxLayout: Specifying Component Sizes.

  • Удалить panelC1 из прилагаемого panelF1, как показано на рисунке here, и восстановить его, когда он снова виден.

  • Используйте макет, отличный от Box.

+0

большое спасибо. Я много служил – user60108

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