主窗体是个JFrame;里面有四个JPanel;位置在上,左,下各放一个,中间来个放大的.
只希望窗口大小变化时.只有中间的JPanel大小铺满剩余位置.
上下两个JPanel高度不变,宽度自动适应整个窗体;
左边的JPanel 宽度不变,高度自动适应;
左上角和左下角的交错部分,不能交错.有代码区分处理即可;
关键是正中间最大块部分要占满剩余位置.窗体大小可变.
不希望在窗口尺寸变化的事件里处理这个问题;
类似于BorderLayout的东南西北中.大概的样子;
上左下三个区域要是能自动隐藏显示就更好了;小弟新手请尽量请清楚,简洁.谢谢!Swing布局java

解决方案 »

  1.   

    一般会把最大化按钮禁用,如果程序必须用最大化就呀借助事件来实现了。如果没有使用布局管理器在setBounds(x,y,width,height)时里面的参数最好是通过其他相邻或父窗体计算出来,不要写具体的数字。窗体改变后调用一下repaint()方法试试。
      

  2.   

    怎么得到 frame内部空间的大小呀. 
      

  3.   

    swing真心不熟,但是还是来接分
      

  4.   

    楼主说的情况就是 BorderLayout 的默认行为。
      

  5.   


    只希望窗口大小变化时.只有中间的JPanel大小铺满剩余位置.
    上下两个JPanel高度不变,宽度自动适应整个窗体;
    左边的JPanel 宽度不变,高度自动适应;===============这正是 BorderLayout 的默认行为没错,
    用不着试,BorderLayout 不知用过多少次了。
      

  6.   


    Swing不熟,接分,顺便帮楼主顶贴!
      

  7.   

    我没有代码的,大大们.这个图片我是在别的地方刚好看到了,截的.
    我就是想要这样的结果.现在做的结构一片空白.
    是不是都想看看初学者的笑话呀.我把图片和代码发上来.大家修改一下.唉,呵呵
    frame = new JFrame();
    frame.setBounds(100, 100, 400, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    pnlTitle = new JPanel();
    pnlTitle.setBackground(Color.ORANGE);
    pnlTitle.setSize(200, 0);
    frame.getContentPane().add(pnlTitle, BorderLayout.NORTH);
    pnlMenu = new JPanel();
    pnlMenu.setBackground(Color.CYAN);
    pnlMenu.setSize(0, 200);
    frame.getContentPane().add(pnlMenu, BorderLayout.WEST);
    pnlWork = new JPanel();
    pnlWork.setBackground(Color.MAGENTA);
    pnlWork.setSize(0, 0);
    frame.getContentPane().add(pnlWork, BorderLayout.CENTER);
      

  8.   

     frame.getContentPane().setLayout(new BorderLayout(0, 0));这句我复制掉了;加上去看到了,高度和宽度根本无用.我这个做来就和我想要的结构.只差一个边上三个PANEL的长宽了.中间是可以铺满.
      

  9.   

    我开始学。NET的时候也是这样的。转16进制都要问人。可是现在别人问我怎么窗体间传值,我心里很想说怎么有这么傻的人,不过我没有说,认真的讲给他听了,所以我现在也来问这种弱知问题。那位直接点代码。谢谢了。我是新人。刚开始学JAVA的。
      

  10.   

    你应该是在每个布局位置中放置一个JPanel,你只需要控制这个JPanel的大小就可以,SWING的布局本来就很扯,多测试几个就可以出效果了
      

  11.   

    TableLayout下载: http://download.csdn.net/detail/inhibitory/5815815import info.clearthought.layout.TableLayout;import javax.swing.*;
    import java.awt.*;public class Hello extends JPanel {
        public Hello() {
            JPanel topPanel = new JPanel();
            topPanel.setBackground(Color.RED);
            topPanel.setPreferredSize(new Dimension(1, 100));        JPanel bottomPanel = new JPanel();
            bottomPanel.setBackground(Color.GREEN);
            bottomPanel.setPreferredSize(new Dimension(1, 100));        JPanel leftPanel = new JPanel();
            leftPanel.setBackground(Color.BLACK);
            leftPanel.setPreferredSize(new Dimension(200, 1));        JPanel rightPanel = new JPanel();
            rightPanel.setBackground(Color.BLUE);        double f = TableLayout.FILL;
            double p = TableLayout.PREFERRED;
            double b = 0;
            double[] col = {b, p, f, b};
            double[] row = {b, p, f, p, b};
            setLayout(new TableLayout(col, row));        add(topPanel, "1, 1, 2, 1");
            add(leftPanel, "1, 2");
            add(rightPanel, "2, 2");
            add(bottomPanel, "1, 3, 2, 3");
        }    private static void createAndShowGui() {
            JFrame frame = new JFrame("");        frame.setContentPane(new Hello());        // Set frame's close operation and location in the screen.
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(600, 600);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }    public static void main(String[] args) throws Exception {
            createAndShowGui();
        }
    }
      

  12.   

    不用第三方控件,只要ECLIPSE SE版本自带的东西。或者自己写。谢谢
      

  13.   

    额,我看你问题上的图片好像是用了分割面板,splitpane
      

  14.   

    使用BorderLayout,布局没有做任何改动:import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;public class LayoutTest {
      
      public static void main(String[] args) {
        
        SwingUtilities.invokeLater(new Runnable() {      @Override
          public void run() {
            
            JFrame f = new JFrame("Test Layout");
            
            Container c = f.getContentPane(); // BorderLayout by default
            
            Dimension size = new Dimension(100, 100);
            c.add(newPanel(Color.BLUE, size), BorderLayout.NORTH);
            c.add(newPanel(Color.GREEN, size), BorderLayout.WEST);
            c.add(newPanel(Color.RED, size), BorderLayout.SOUTH);
            c.add(newPanel(Color.WHITE, size), BorderLayout.CENTER);
            
            f.pack();
            f.setMinimumSize(f.getSize());
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setVisible(true);
          }
        });
      }
      
      private static JComponent newPanel(Color color, Dimension preferredSize) {
        
        assert color != null;
        assert preferredSize != null;
        
        JComponent c = new JPanel();
        c.setBackground(color);
        c.setPreferredSize(preferredSize);
        return c;
      }
    }
      

  15.   

    raistlic 这正是 BorderLayout 的默认行为没错,
    用不着试,BorderLayout 不知用过多少次了
    先谢谢 RAISTLIC 了.一看说话就知道常常在一线的人才; 认真看了你的代码.明白了为什么;我主要的问题没有明白底层了一些基础东西;setPreferredSize 和SETSIZE有区别;就这句话我的问题解决;那位什么"公孙二狗 ",看你名字就知道你是个什么鸟了;确实你写程序比我们都牛.只是做人太差;新人本来就是知道得太少,而且想多学点.你一来就叫人家去安装什么控件;干嘛不叫我去请人开发呢;就一句代码修改一下就好了;你还讲这么多,不知道你的技术是怎么练成的; raistlic  虽说没有看怎么看我代码起码认真看了问题.去动手处理好了 ,有结果;更不会看不起新人;
    大家可以去看看别人写的说明,很有帮助的.当然被某人删除了我也没办法,大家都不会也好天天在这里来提小问题.:http://tieba.baidu.com/p/2101752057
      

  16.   

    来张图楼主看一下.代码只要修改所有的SETSIZE为setPreferredSize 即可.先解决问题再说;
    另外间距在这里设置 new BorderLayout(5, 5) ;修改一下可能你需要的.
    另外居中可以一句话:frame.setLocationRelativeTo(null);