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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

Apache Tiles 布局管理器

陈科肇 =========== 1.简介 一个免费的开源模板框架现代Java应用程序。  基于该复合图案它是建立以简化的用户界面的开发。 对于复杂的网站,它仍然最简单,最优雅的方式来一起工作的任何MVC技术。 Tiles允许作者定义页面片段可被组装成在运行一个完整的网页。  这些片段,或Tiles,可以用于为了降低公共页面元素的重复,简单地包括或嵌入在其它瓦片,制定了一系列可重复使用

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在