2013-10-31 87 views
1

我在Java中并没有真正与Swing合作。我正在试验它。我想做一个尺寸不能改变的布局布局。我已经看到很多建议使用布局管理器将多个Jpanel添加到Jframe中的事情。不过,我所看到的所有涉及布局管理器的教程都表示,它允许用户调整屏幕大小。我想要的布局有一个沿着左侧的矩形,沿着底部的一个薄矩形,以及占据剩余空间的第三个矩形。我尝试使用绝对布局,但它只是不想为我工作。使用JPanels设置布局

import java.awt.Color; 

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


public class Test extends JFrame { 

    public Test() { 
     JPanel rect1 = new JPanel(); 
     rect1.setBounds(101, 650, 900, 50); 
     rect1.setBackground(Color.RED); 
     getContentPane().add(rect1); 

     JPanel rect2 = new JPanel(); 
     rect2.setBounds(0, 650, 100, 1000); 
     rect2.setBackground(Color.BLUE); 
     getContentPane().add(rect2); 

     JPanel rect3 = new JPanel(); 
     rect3.setBounds(101, 700, 900, 950); 
     rect3.setBackground(Color.GREEN); 
     getContentPane().add(rect3); 

     setTitle("TEST"); 
     setSize(1000, 700); 

     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE);   
    } 


    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Test ex = new Test(); 
       ex.setVisible(true); 
      } 
     }); 
    } 
} 

有人可以帮助我在这种布局(所有不同的颜色)在Jframe中正确地制造三个Jpanels吗?

回答

2

您可以使用setResizable()。请参考下面的代码片段。

setResizable(false); // this will not allow resizing 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
1

AbsoluteLayout是不行。不要这样做。您可能正在寻找BorderLayout。查看教程:How to Use BorderLayout了解详情。如果你不想让你的JFrame能够重新使用frame.setResizable(false);就可以了。

3

您可以使用BorderLayout作为基准或甚至GridBagLayout来实现相同的目的。

你缺少的主要部件是布局管理器使用(或可以根据布局管理器使用)组件的首选/最小/最大尺寸

基本的事实,你会做什么是定义一个自定义组件(从JPanel延伸)并覆盖它的getPreferredSize方法并返回所需的值。根据布局管理器的不同,您也可能需要覆盖getMaximumSizegetMinimumSize方法。

例如...

基本上,这显示了 “默认” 的大小,什么时候调整屏幕大小会发生......

enter image description hereenter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FixedSizeLayout { 

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

    public FixedSizeLayout() { 
     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 GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 

      add(new ContentPane(), gbc); 
      gbc.gridx++; 
      add(new LeftPane(), gbc); 
      gbc.gridwidth = 2; 
      gbc.gridx = 0; 
      gbc.gridy = 1; 
      add(new BottomPane(), gbc); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

    public class ContentPane extends JPanel { 

     public ContentPane() { 
      setBackground(Color.GREEN); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(150, 150); 
     } 

     @Override 
     public Dimension getMinimumSize() { 
      return getPreferredSize(); 
     } 

     @Override 
     public Dimension getMaximumSize() { 
      return getPreferredSize(); 
     } 

    } 

    public class BottomPane extends JPanel { 

     public BottomPane() { 
      setBackground(Color.RED); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 50); 
     } 

     @Override 
     public Dimension getMinimumSize() { 
      return getPreferredSize(); 
     } 

     @Override 
     public Dimension getMaximumSize() { 
      return getPreferredSize(); 
     } 

    } 

    public class LeftPane extends JPanel { 

     public LeftPane() { 
      setBackground(Color.BLUE); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(50, 150); 
     } 

     @Override 
     public Dimension getMinimumSize() { 
      return getPreferredSize(); 
     } 

     @Override 
     public Dimension getMaximumSize() { 
      return getPreferredSize(); 
     } 

    } 
} 

现在,如果你更喜欢,你可以让屏幕不可调整大小,但我一个人不会喜欢你。我更喜欢使用布局管理器的强大功能,并允许用户就他们想如何查看内容做出决定......我可以......但这只是我(我不喜欢除了一些对话框的情况)

+0

回答我1问题。你什么时候睡觉 ? – Sage

+0

我是一个18个月的骄傲的父亲,我不睡觉...永远...... – MadProgrammer

+0

现在,我真的感到难过,因为我不能发布这样的问题,我可以upvote并接受答案。 :P。无论如何挑战接受。 :| :)) – Sage