2015-05-26 4 views
1

Итак, я программирую приложение с использованием Java Swing, и мне интересно, как сделать так, чтобы при изменении размера всего приложения только некоторые панели изменялись по-разному. Посмотрите на две фотографии ниже:Как выбрать, какой размер JPanel в области сплит изменяется при использовании всего приложения. изменяется?

JavaSwing before resize JavaSwing after resize

У меня есть три вертикальных панелей, как вы можете видеть. Теперь, когда высота приложения увеличивается, все три высоты панелей также должны увеличиваться, что отлично работает. Однако, когда ширина увеличивается, я хочу, чтобы была увеличена только ширина средней панели (которая будет «рабочей областью»). Вместо этого, как вы можете видеть, третья панель с последним добавляется справа - это единственная, ширина которой увеличивается.

Как это сделать, чтобы только средний JPanel растягивается & сжимается при изменении размера окна по оси x? Кроме того, позже я хотел бы сделать так, чтобы эта панель рабочего пространства не всегда была посередине; так как пользователь может переместить две другие панели вокруг, чтобы настроить приложение по своему вкусу, например, чтобы две другие панели располагались друг над другом слева, а рабочее пространство справа. Однако независимо от того, где именно, я хочу, чтобы панель рабочей области была той, которая имеет размеры, как мне это сделать?

+0

Бьюсь об заклад, вы можете использовать 'WindowListener', и я думаю, что метод' windowResized() ', выберите вашу' среднюю панель' и соответствующим образом измените ее размер. Я не уверен, что вы можете получить старую ширину (сохранить ее?), Или вы можете сделать «middlepanel.setWidth (window.getWidth() - leftpanel.getWidth() - rightpanel.getWidth());' – CoderMusgrove

+0

См. Также [ Как создать отличные скриншоты?] (Http://meta.stackexchange.com/q/99734/155831) –

+0

Чтобы лучше помочь, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve) (Минимальный Полный проверенный пример) или [SSCCE] (http://www.sscce.org/) (Короткое, самосохранение, правильный пример). Это сделало бы очевидным, что вы имеете в виду панели в (пару) ** компонентов 'JTabbedPane' **! –

ответ

3

Хитрость заключается в вызове setResizeWeight(double) на правильной панели с соответствующим значением. НАПРИМЕР.

Two split panes at minimum size

Two split panes with extra width

Two split panes with extra width & height

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class DualingSplitPanes { 

    private JComponent ui = null; 

    DualingSplitPanes() { 
     initUI(); 
    } 

    protected final void addPanelsToUi(JPanel p1, JPanel p2, JPanel p3) { 
     JSplitPane sp1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, p1, p2); 
     JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp1, p3); 
     sp2.setResizeWeight(1); 

     ui.add(sp2); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new BorderLayout(4,4)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     JPanel treeContainer = new JPanel(new GridLayout()); 
     JTree tree = new JTree(); 
     tree.setVisibleRowCount(5); 
     for (int i=tree.getVisibleRowCount()-1; i>-1; i--) { 
      tree.expandRow(i); 
     } 
     treeContainer.add(new JScrollPane(tree)); 

     JPanel workSpaceContainer = new JPanel(new GridLayout()); 
     workSpaceContainer.add(new JTextArea(5, 10)); 

     JPanel searchContainer = new JPanel(new BorderLayout(4, 4)); 
     searchContainer.add(new JScrollPane(new JTextArea(5, 10))); 

     addPanelsToUi(treeContainer, workSpaceContainer, searchContainer); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       DualingSplitPanes o = new DualingSplitPanes(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
-1

Вы можете сделать опор для ящиков, так что они зависят от их соответствующей части окна.

Таким образом, левая панель имеет X пикселей слева, а правая панель - Y пикселей справа, а вторая - с левой стороны X + слева, а правая сторона Y + - с левой стороны. правильно.

Это работает, если вы не изменяете размер окна слишком маленьким (потому что тогда элементы становятся слишком большими).

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