Java GUI中 BorderLayout中的North区用FlowLayout,North区高度自动变化



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);

 }
}







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值