2012-09-04 2 views
3

Я хочу, чтобы мой экран разбился на две части, поэтому я использовал BorderLayout с разделами Восток и Запад. У меня были проблемы с изменением размера, и я, в конце концов, узнал (см .: http://www.leepoint.net/notes-java/GUI/layouts/20borderlayout.html), что ширина не изменяется на панелях Востока и Запада, а высота не изменяется на панелях Севера и Юга, и оба изменены на панели Центра.Java Swing BorderLayout трудности с изменением размера

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

Кажется, что это должно быть легко для менеджера компоновки по умолчанию, но, возможно, я должен попробовать другой макет (например, BoxLayout), чтобы добиться того, что я хочу?

Также здесь есть некоторый код, который дублирует эту проблему я говорю (попробуйте изменить размер окна):

import java.awt.BorderLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main extends JFrame { 

    public static void main(String[] args) { 
     JFrame window = new Main(); 
     window.setVisible(true); 
    } 

    public Main() { 
     JButton east = new JButton("East"); 
     JButton west = new JButton("West"); 

     JPanel content = new JPanel(); 
     content.setLayout(new BorderLayout()); 

     content.add(east, BorderLayout.EAST); 
     content.add(west, BorderLayout.WEST); 

     setContentPane(content); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
    } 

} 

Edit: Я не хочу, чтобы обе стороны быть равна, примерно 2: 1 соотношение это то, что я хочу.

+1

Если вы хотите разбить его на две части. Почему вы не используете GridLayout? – Sednus

ответ

6

Что вы можете использовать в своем случае: GridLayout, здесь два JButtons будут изменять размеры, поскольку размеры JFrame изменяются.

import java.awt.GridLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Main extends JFrame { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       JFrame window = new Main(); 
       window.setVisible(true); 
      } 
     });   
    } 

    public Main() { 
     JButton east = new JButton("East"); 
     JButton west = new JButton("West"); 

     JPanel content = new JPanel(); 
     content.setLayout(new GridLayout(1, 2)); 

     content.add(east); 
     content.add(west); 

     setContentPane(content); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
    } 

} 

Кроме того, это всегда лучше, чтобы запустить свой GUI код, связанный с EDT - Event диспетчерского тему, а не от основного потока. Прочитайте Concurrency in Swing, для получения дополнительной информации по этой теме.

Последняя EDIT: В соответствии с запрошенной комментарий

Используйте GridBagLayout, чтобы указать размер, который вы хотите дать

import java.awt.Color; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Main extends JFrame { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       JFrame window = new Main(); 
       window.setVisible(true); 
      } 
     });   
    } 

    public Main() { 
     JPanel east = new JPanel(); 
     east.setOpaque(true); 
     east.setBackground(Color.WHITE); 
     JPanel west = new JPanel(); 
     west.setOpaque(true); 
     west.setBackground(Color.BLUE); 

     JPanel content = new JPanel(); 
     content.setLayout(new GridBagLayout()); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.FIRST_LINE_START; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.weightx = 0.3; 
     gbc.weighty = 1.0; 
     gbc.gridx = 0; 
     gbc.gridy = 0; 

     content.add(east, gbc); 
     gbc.weightx = 0.7; 
     gbc.gridx = 1; 
     content.add(west, gbc); 

     setContentPane(content); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
    } 

} 
+0

Спасибо за совет. Однако кое-что, о чем я не упоминал ранее, состоит в том, что я не хочу, чтобы стороны были равными. Может ли GridLayout это сделать? – Paul

+0

Для этого вам понадобится 'GridBagLayout', который дает вам свободу определять размеры ваших' JComponents' с помощью ограничений. Дайте мне когда-нибудь, пример на этом пути :-) –

+0

Посмотрите это редактирование сейчас, я надеюсь, что это то, что вы имели в виду под неравными размерами. –

7

Почему бы вам не попробовать с JSplitPane:

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

public class AppDemo { 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(() -> { 
      JFrame frame = new JFrame(); 
      JButton eastButton = new JButton("East"); 
      JButton westButton = new JButton("West"); 
      JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, eastButton, westButton); 

      JPanel content = new JPanel(); 
      content.setLayout(new BorderLayout()); 
      content.add(splitPane, BorderLayout.CENTER); 

      frame.setContentPane(content); 
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      frame.setPreferredSize(new Dimension(500, 400)); 
      frame.pack(); 
      frame.setVisible(true); 
     }); 

    } 
} 

Вы получите это:

enter image description here

+0

Информационный ввод +1 :-) –

+0

Спасибо, сэр! :) –

+0

ВЫ МОЖЕТЕ ДОБРО ПОЖАЛОВАТЬ И СОХРАНЯТЬ СМОТРЕТЬ :-) –

0

Если вы хотите сохранить BorderLayout вы можете использовать что-то вроде следующего объекта:

public class ResizablePanel extends JPanel { 

    public ResizablePanel(JComponent body) { 

    setLayout(new BorderLayout()); 
    JButton resize = new JButton(); 
    resize.setPreferredSize(new Dimension(Integer.MAX_VALUE, 4)); 
    resize.addMouseMotionListener(new MouseAdapter() { 
     public void mouseDragged(MouseEvent e) { 
      Dimension preferredSize = ResizablePanel.this.getPreferredSize(); 
      ResizablePanel.this.setPreferredSize(new Dimension(preferredSize.width, preferredSize.height-e.getY())); 
      ResizablePanel.this.revalidate(); 
     } 
    });    
    add(resize, BorderLayout.PAGE_START); 
    add(body, BorderLayout.CENTER); 
    } 
} 

Теперь оберните часть, которую вы хотите изменить с экземпляром ResizablePanel, и вы будете иметь возможность изменять размер перетаскивая тонкую кнопку.

Обратите внимание, что это код для изменения размера высоты из панели, что вы положили в нижней части (PAGE_END) часть макета границы, но он должен быть достаточно простым, чтобы изменить его для изменения размера ширины.

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