SWT/Jface 自定义布局 原创

2024-01-24 03:38

本文主要是介绍SWT/Jface 自定义布局 原创,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不多说了 直接贴代码

 

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

public class BorderLayout extends Layout{
 
 private Control north;
 private Control south;
 private Control east;
 private Control west;
 private Control center;
 
 @Override
 protected Point computeSize(Composite composite, int wHint, int hHint,
   boolean flushCache) {
  getControls(composite);
  //定义面板的宽和高
  int width = 0,height = 0;
  //计算面板的宽度
  width += west == null ? 0 : getSize(west,flushCache).x;
  width += east == null ? 0 : getSize(east,flushCache).x;
  width += center == null ? 0 : getSize(center,flushCache).x;
  //如果上部和下部有控件,则宽度去最大值
  if(north != null){
   Point pt = getSize(north, flushCache);
   width = Math.max(width, pt.x);
  }
  if(south != null){
   Point pt = getSize(south, flushCache);
   width = Math.max(width, pt.x);
  }
  
  //计算面板的高度
  height += north == null ? 0 : getSize(north, flushCache).y;
  height += south == null ? 0 : getSize(south, flushCache).y;
  System.out.println("width> "+width+"height>"+height);
  int heightOther = center == null ? 0 : getSize(center,flushCache).y;
  if(west != null){
   Point pt = getSize(west, flushCache);
   heightOther = Math.max(heightOther, pt.y);
  }
  if(east != null){
   Point pt = getSize(east, flushCache);
   heightOther = Math.max(heightOther, pt.y);
  }
  height +=heightOther;
  //计算的宽和高与默认的宽和高度作比较,返回之中较大的
  return new Point(Math.max(width, wHint),Math.max(height, hHint));
 }

 @Override
 protected void layout(Composite composite, boolean flushCache) {
  getControls(composite);
  //获得当前面板可显示的区域
  Rectangle rect = composite.getClientArea();
  int left = rect.x,
    right = rect.width,
    top = rect.y,
    bottom = rect.height;
  //将各个控件放置到面板中
  if(north != null){
   Point pt = getSize(north, flushCache);
   top += pt.y;
  }
  if(south != null){
   Point pt = getSize(south, flushCache);
   south.setBounds(left, rect.height-pt.y, rect.width, pt.y);
   bottom -= pt.y;
  }
  if(east != null){
   Point pt = getSize(east, flushCache);
   east.setBounds(rect.width-pt.x, top, pt.x, (bottom-top));
   right -= pt.x;
  }
  if(west != null){
   Point pt = getSize(west, flushCache);
   west.setBounds(left, top, pt.x,(bottom-top));
   left += pt.x;
  }
  if(center !=null){
   center.setBounds(left, top, (right-left), (bottom-top));
  }
 }

 private Point getSize(Control control, boolean flushCache) {
  return control.computeSize(SWT.DEFAULT,SWT.DEFAULT,flushCache);
 }


 private void getControls(Composite composite) {
  Control[] children = composite.getChildren();
  for(int i=0,n=children.length;i<n;i++){
   Control child = children[i];
   BorderData borderData = (BorderData)child.getLayoutData();
   if(borderData.region == SWT.TOP)
    north = child;
   else if(borderData.region == SWT.BOTTOM)
    south = child;
   else if(borderData.region == SWT.RIGHT)
    east = child;
   else if(borderData.region == SWT.LEFT)
    west = child;
   else
    center = child;
  }
 }
 

}

import org.eclipse.swt.SWT;

public class BorderData {

  public int region = SWT.CENTER;
  public BorderData(){
  }
  public BorderData(int region){
  this.region = region;
  }
}

 

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;

public class TestBorderLayout {

 public static void main(String[] args) {
  Display display =  new Display();
  Shell shell = new Shell(display);
  shell.setSize(200,150);
  shell.setLayout(new BorderLayout());
  shell.setLayoutData(new BorderData());
  Button buttonWest = new Button(shell,SWT.PUSH);
  buttonWest.setText("左");
  buttonWest.setLayoutData(new BorderData(SWT.LEFT));
  
  Button buttonEast = new Button(shell,SWT.PUSH);
  buttonEast.setText("右");
  buttonEast.setLayoutData(new BorderData(SWT.RIGHT));
  
  Button buttonSouth = new Button(shell,SWT.PUSH);
  buttonSouth.setText("下");
  buttonSouth.setLayoutData(new BorderData(SWT.BOTTOM));
  

  Button buttonNorth = new Button(shell,SWT.PUSH);
  buttonNorth.setText("上");
  buttonNorth.setLayoutData(new BorderData(SWT.TOP));
  
  Text text = new Text(shell,SWT.MULTI);
  text.setText("中间");
  text.setLayoutData(new BorderData(SWT.CENTER));
  
  shell.pack();
  shell.open();
  
  while (!shell.isDisposed()){
   if(!display.readAndDispatch()){
    display.sleep();
   }
  }
  display.dispose();
 }

}

 

 

 

这篇关于SWT/Jface 自定义布局 原创的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/638436

相关文章

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

CSS3 布局样式及其应用举例

《CSS3布局样式及其应用举例》CSS3的布局特性为前端开发者提供了无限可能,无论是Flexbox的一维布局还是Grid的二维布局,它们都能够帮助开发者以更清晰、简洁的方式实现复杂的网页布局,本文给... 目录深入探讨 css3 布局样式及其应用引言一、CSS布局的历史与发展1.1 早期布局的局限性1.2

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT