转自:http://lookbing.iteye.com/blog/518139
最后在做一个俄罗斯方块的小游戏,看着视频做挺简单的,都是手把手的,一行代码一行代码的教.. 自己亲自动手做,才发现难,真难.在界面布局这块就出问题,走不动了. 游戏主要分三块显示区, 主游戏区,下一个游戏图形区,游戏状态区(速度,得分)
每一个显示区放在一个JPanel中,用了N种布局方式,显示出来总有问题.
1. BorderLayout的时候,中间区域总是最大,右边显示不出界面(右边大小总是很小,用jpanel.setSize()改变JPANEL大小不管用), 这种布局方式本来就是左右宽度不变,上下高度不变,在窗口改变大小的时候.
2. FlowLayout的时候,两个jpanel显示出来了,但是只有一丁点小.如上设置大小不管用.
3. gridLayout的时候,两个jpanel总是一样的大,但是这太不符合游戏风格了吧,左边的主游戏区要大一些才合理.
最后不得己,采用绝对定位的方式来布局,勉强算过去了,但是心一直不安,Swing不会这么菜,布局这么栏,这点功能都实现不了?
在网上搜索了很久,用Eclipse不断的尝试小程序,.终于还是让我发现了问题的根源.[size=medium]在设置JPanel大小的时候,要用JPanel.setPreferredSize()这个方法才行.哈哈,问题总算是解决了,回去后再改代码吧.用这个方法改JPanel大小之后,立马显示出来效果,大borderLayout中上下左右就可以控制宽度了.哈哈
以下是个小小的测试代码
[/size]
每一个显示区放在一个JPanel中,用了N种布局方式,显示出来总有问题.
1. BorderLayout的时候,中间区域总是最大,右边显示不出界面(右边大小总是很小,用jpanel.setSize()改变JPANEL大小不管用), 这种布局方式本来就是左右宽度不变,上下高度不变,在窗口改变大小的时候.
2. FlowLayout的时候,两个jpanel显示出来了,但是只有一丁点小.如上设置大小不管用.
3. gridLayout的时候,两个jpanel总是一样的大,但是这太不符合游戏风格了吧,左边的主游戏区要大一些才合理.
最后不得己,采用绝对定位的方式来布局,勉强算过去了,但是心一直不安,Swing不会这么菜,布局这么栏,这点功能都实现不了?
在网上搜索了很久,用Eclipse不断的尝试小程序,.终于还是让我发现了问题的根源.[size=medium]在设置JPanel大小的时候,要用JPanel.setPreferredSize()这个方法才行.哈哈,问题总算是解决了,回去后再改代码吧.用这个方法改JPanel大小之后,立马显示出来效果,大borderLayout中上下左右就可以控制宽度了.哈哈
以下是个小小的测试代码
[/size]
- import java.awt.BorderLayout;
- import java.awt.Dimension;
- import javax.swing.BorderFactory;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JToolBar;
- public class MainFrame extends JFrame{
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- MainFrame mai=new MainFrame();
- mai.setLayout(new BorderLayout());
- JToolBar jtoolbar=new JToolBar();
- JLabel jl=new JLabel("state");
- jtoolbar.add(jl);
- JPanel jpanel1=new JPanel();
- JButton jb1=new JButton("North");
- jpanel1.setPreferredSize(new Dimension(300, 150));//关键代码,设置JPanel的大小
- jpanel1.add(jb1);
- jpanel1.setBorder(BorderFactory.createEtchedBorder());
- JButton jb2=new JButton("Center");
- mai.add(jpanel1,BorderLayout.EAST);
- mai.add(jb2,BorderLayout.CENTER);
- mai.add(jtoolbar,BorderLayout.SOUTH);
- mai.setSize(300, 400);
- mai.setVisible(true);
- mai.setDefaultCloseOperation(EXIT_ON_CLOSE);
- }
- }
-