BorderLayout中的North区用FlowLayout,想让North区高度根据窗口宽度自动变化,但是做出的效果如下
折腾了一会儿找到办法了,效果如下:
-----------------------------实现方法-------------------------------------
1.要想改变North区的高度,要用到North区panel对象的setPreferredSize()方法
2.通过读按钮8的Y坐标发现按钮8实际上已经自动切换到第二排,只是显示不出来,通过“按钮8”的getY()方法获取Y坐标再加上按钮8的高度和组件间距,就是North区实际上应该有的高度
3.通过主窗口Frame对象的addComponentListener()方法增加组件大小变化监听。在拖动改变窗口大小时动态改变North区的高度
4.核心代码如下:
f.addComponentListener(new ComponentAdapter(){
//窗口大小改变时调用此方法
public void componentResized(ComponentEvent e) {
//获取panel1的最后一个component
Component lastComponent=panel1.getComponent(panel1.getComponentCount()-1);
//获取主窗口的宽度
int p1_width=(int) f.getSize().getWidth();
//panel1的高度=最后一个组件的Y坐标+组件高度+间距
int p1_height=lastComponent.getY()+(int)lastComponent.getSize().getHeight()+5;
//设置panel1大小
panel1.setPreferredSize(new Dimension(p1_width,p1_height));
}
});
-------------------------------------------------------------------------------
整体代码如下:
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Demo {
public static void main(String[] args){
final Frame f=new Frame("数据转换");
f.setBounds(500,100,500,400);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setLayout(new BorderLayout());
final Panel panel1 =new Panel(new FlowLayout());
Panel panel2 =new Panel(new BorderLayout());
f.add(panel1,BorderLayout.NORTH);
f.add(panel2,BorderLayout.CENTER);
final TextField txt=new TextField(20);
final TextArea textArea=new TextArea("这里是panel 2 里的TextArea");
final Button button=new Button("数据转换");
final Button button1=new Button("按钮1");
final Button button2=new Button("按钮2");
final Button button3=new Button("按钮3");
final Button button4=new Button("按钮4");
final Button button5=new Button("按钮5");
final Button button6=new Button("按钮6");
final Button button7=new Button("按钮7");
final Button button8=new Button("按钮8");
panel1.add(txt);
panel1.add(button);
panel1.add(button1);
panel1.add(button2);
panel1.add(button3);
panel1.add(button4);
panel1.add(button5);
panel1.add(button6);
panel1.add(button7);
panel1.add(button8);
panel2.add(textArea);
f.addComponentListener(new ComponentAdapter(){
//窗口大小改变时调用此方法
public void componentResized(ComponentEvent e) {
//获取panel1的最后一个component
Component lastComponent=panel1.getComponent(panel1.getComponentCount()-1);
//获取主窗口的宽度
int p1_width=(int) f.getSize().getWidth();
//panel1的高度=最后一个组件的Y坐标+组件高度+间距
int p1_height=lastComponent.getY()+(int)lastComponent.getSize().getHeight()+5;
//设置panel1大小
panel1.setPreferredSize(new Dimension(p1_width,p1_height));
}
});
f.setVisible(true);
}
}