2012-09-04 69 views
3

我想将我的屏幕拆分为两部分,所以我使用了BorderLayout和East和West部分。我在调整大小时遇到​​了问题,最终我发现(请参阅: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(); 
    } 

} 

编辑:我不希望双方是平等的,大约为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(); 
    } 

} 

此外,总是最好从EDT - Event Dispatch Thread运行GUI相关代码,而不是从主线程运行。请阅读Concurrency in Swing,了解更多关于该主题的信息。

最新编辑:按照要求评论

使用的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)边界布局的一部分面板的,但它应该是相当简单的改变,以调整大小的宽度。