`
salever
  • 浏览: 255716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【原创】Draw2D版本的标签控件TabFolder实现

阅读更多

TabFolder是一个很有用的控件,尤其在进行单界面内的多页布局时。使用Draw2D开发的时候却会发现它本身没有实现TabFolder,在网上搜索一番未果,索性自己实现好了。

 

这里给出一个简单的实现,原理很简单,使用了Draw2d的GridLayout和StackLayout布局。

 

首先需要一个Folder容器,这里扩展Panel实现,直接上代码好了,

 

TabFolderFigure.java

 

/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) All rights reserved. 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 *  http://www.ceclipse.org
 *
 * Contributors:
 *   salever@126.com - initial API and implementation 
 *******************************************************************************/
package org.eclipse.gef.examples.shapes.figures;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FlowLayout;
import org.eclipse.draw2d.GridData;
import org.eclipse.draw2d.GridLayout;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.Panel;
import org.eclipse.draw2d.StackLayout;

/**
 * 便签页容器
 * 
 * @author salever@126.com
 * 
 */
public class TabFolderFigure extends Panel {

	/**
	 * @return the items
	 */
	public List<TabItemFigure> getItems() {
		return items;
	}

	public static final int TAB_ITEM_HEIGHT = 25;

	/**
	 * 标题部分
	 */
	private Figure itemPanel;

	/**
	 * 控件区域部分
	 */
	private Panel contentPanel;

	private StackLayout stackLayout;

	private List<TabItemFigure> items;

	public TabFolderFigure() {
		super();
		init();
	}

	private void init() {

		items = new ArrayList<TabItemFigure>();
		GridLayout gridLayout;
		gridLayout = new GridLayout();
		gridLayout.verticalSpacing = 0;
		stackLayout = new StackLayout();
		contentPanel = new Panel();
		contentPanel.setBackgroundColor(ColorConstants.white);

		itemPanel = new Figure();

		this.setLayoutManager(gridLayout);
		this.add(itemPanel);
		this.add(contentPanel);
		this.setBorder(new LineBorder());

		GridData item_gd = new GridData(GridData.FILL_HORIZONTAL);
		item_gd.heightHint = TAB_ITEM_HEIGHT;
		gridLayout.setConstraint(itemPanel, item_gd);
		FlowLayout flowlayout = new FlowLayout();
		flowlayout.setMajorSpacing(0);//填充无间隔
		flowlayout.setMinorSpacing(0);//填充无间隔
		itemPanel.setLayoutManager(flowlayout);

		GridData content_gd = new GridData(GridData.FILL_BOTH);
		gridLayout.setConstraint(contentPanel, content_gd);
		contentPanel.setLayoutManager(stackLayout);
	}

	/**
	 * 添加TabItem
	 * 
	 * @param item
	 */
	public void addItem(TabItemFigure item) {
		itemPanel.add(item.getItem());
		contentPanel.add(item.getContentArea());
		item.getContentArea().setVisible(true);
		items.add(item);
	}

	/**
	 * 选中某个便签项
	 * @param item
	 */
	public void select(TabItemFigure item) {
		for (TabItemFigure tif : items) {
			if (tif.equals(item)) {
				tif.onTop();
			} else {
				tif.disOnTop();
			}
		}
	}
}

 很简单,将一个完整的Panel分成了上下两部分,分别用于安放标签额度标题和具体内容。

 

下面是TabItem实现,这里使用Button表示标签的标题,Panel作为主组件区域。

TabItemFigure.java

/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) All rights reserved. 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 *  http://www.ceclipse.org
 *
 * Contributors:
 *   salever@126.com - initial API and implementation 
 *******************************************************************************/
package org.eclipse.gef.examples.shapes.figures;

import org.eclipse.draw2d.ActionEvent;
import org.eclipse.draw2d.ActionListener;
import org.eclipse.draw2d.Button;
import org.eclipse.draw2d.ButtonModel;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.GridData;
import org.eclipse.draw2d.GridLayout;
import org.eclipse.draw2d.Panel;
import org.eclipse.jface.resource.JFaceResources;

/**
 * 便签页
 * 
 * @author salever@126.com
 * 
 */
public class TabItemFigure {

	private static final int WIDTH_DIFF = 10;

	private Button item;

	private Panel contentArea;

	private GridLayout gridLayout;

	private TabFolderFigure tabFolder;

	private boolean onTop;

	/**
	 * 
	 * @param tabFolder
	 * @param name
	 */
	public TabItemFigure(TabFolderFigure tabFolder, String name) {
		this.tabFolder = tabFolder;
		item = new Button(name);
		item.setPreferredSize(FigureUtilities.getTextWidth(name, JFaceResources
				.getDefaultFont())
				+ WIDTH_DIFF, TabFolderFigure.TAB_ITEM_HEIGHT);
		contentArea = new Panel();
		gridLayout = new GridLayout();
		gridLayout.marginHeight = 0;
		gridLayout.marginWidth = 0;
		contentArea.setLayoutManager(gridLayout);
		onTop = false;
		init();

	}

	private void init() {
		ButtonModel model = new ButtonModel();
		model.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				tabFolder.select(TabItemFigure.this);
			}
		});
		item.setModel(model);

	}

	/**
	 * 刷新组件状态
	 */
	protected void refreshState() {
		if (onTop) {
			getItem().setBackgroundColor(ColorConstants.white);
			getContentArea().setVisible(true);
		} else {
			getItem().setBackgroundColor(ColorConstants.button);
			getContentArea().setVisible(false);
		}
	}

	/**
	 * @return the item
	 */
	public Button getItem() {
		return item;
	}

	/**
	 * @return the contantArea
	 */
	public Panel getContentArea() {
		return contentArea;
	}

	/**
	 * 设置主控件
	 * 
	 * @param figure
	 */
	public void setContent(Figure figure) {
		contentArea.add(figure);
		GridData gd = new GridData(GridData.FILL_BOTH);
		gridLayout.setConstraint(figure, gd);
	}

	/**
	 * 最前
	 */
	public void onTop() {
		onTop = true;
		refreshState();
	}

	/**
	 * 取消最前
	 */
	public void disOnTop() {
		onTop = false;
		refreshState();
	}
}

 

下面测试一下,

/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) All rights reserved. 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 *  http://www.ceclipse.org
 *
 * Contributors:
 *   salever@126.com - initial API and implementation 
 *******************************************************************************/
package org.eclipse.gef.examples.shapes.figures;

import org.eclipse.draw2d.Button;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Ellipse;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.GridData;
import org.eclipse.draw2d.GridLayout;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.Panel;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * TODO 此处填写 class 信息
 * 
 * @author 
 * @date 2011-4-19
 */
public class Test {
	

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);

		Test app = new Test(shell);

		shell.open();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		display.dispose();
	}

	public Test(Shell shell) {
		shell.setText("Tab folder demo");
		shell.setBounds(100, 100, 500, 500);
		shell.setLayout(new FillLayout(SWT.VERTICAL));
		FigureCanvas canvas = new FigureCanvas(shell);
		
		Figure root = new Figure();
		GridLayout layout = new GridLayout();
		root.setLayoutManager(layout);
		
		TabFolderFigure tabFolder = new TabFolderFigure();
		TabItemFigure item1 = new TabItemFigure(tabFolder,"item1");
		
		Figure ic1= new Panel();
		ic1.setBackgroundColor(ColorConstants.lightBlue);
		ic1.setLayoutManager(new XYLayout());
		Label label = new Label("AAAAAAAAAAA");
		label.setBounds(new Rectangle(10,10,100,50));
		label.setBorder(new LineBorder());
		ic1.add(label);
		label.setBackgroundColor(ColorConstants.red);
		item1.setContent(ic1);
		tabFolder.addItem(item1);
		
		item1 = new TabItemFigure(tabFolder, "item2222222221");
		ic1= new Panel();
		ic1.setBackgroundColor(ColorConstants.lightGreen);
		Button button = new Button("Button");
		button.setBounds(new Rectangle(10,10,100,20));
		ic1.add(button);
		label.setBackgroundColor(ColorConstants.red);
		item1.setContent(ic1);
		tabFolder.addItem(item1);
		
		item1 = new TabItemFigure(tabFolder, "item23331");
		ic1= new Panel();
		Ellipse shape = new Ellipse();
		shape.setBounds(new Rectangle(10,10,300,300));
		ic1.add(shape);
		ic1.setBackgroundColor(ColorConstants.white);
		item1.setContent(ic1);
		tabFolder.addItem(item1);
		
		
		root.add(tabFolder);
		
		GridData gd = new GridData(GridData.FILL_BOTH);
		layout.setConstraint(tabFolder, gd);
		
		canvas.setContents(root);
	}


}

 效果见下图:

 

 

 

 

0
5
分享到:
评论
1 楼 cool_future 2012-09-03  
谢谢分享,我正好需要

相关推荐

    pb控件:xp风格的TAB控件

    在PowerBuilder中,你可以使用内建的TabFolder控件来实现这种功能。TabFolder控件允许你在一个窗口中创建多个页面,每个页面都有自己的标题,用户可以通过点击标题在各个页面之间切换。创建这个控件的步骤包括: 1....

    PB-mdi窗口标签切换示例

    PB提供了多种标签控件,如TabFolder或TabPage,可以根据需要选择合适的控件类型。 4. **事件处理**:为了实现标签切换功能,需要编写事件处理代码。例如,当用户点击某个标签时,对应的sheet窗口应该被激活。这可能...

    Eclipse插件开发学习笔记1-8章

    - 熟悉如何使用组合控件(Composite)和分页控件(TabFolder)来创建复杂的用户界面。 7. **SWT/JFace的事件处理** (10第8章 SWT/JFace的事件处理.pdf) - 学习事件驱动编程,理解Event和Listener接口,以及如何...

    SWT 编 程 总 结

    - **org.eclipse.swt.widgets**:包含了所有SWT控件的实现。 - **org.eclipse.swt.layout**:提供了不同的布局管理器。 - **org.eclipse.swt.events**:处理用户交互的事件系统。 #### 6. SWT应用程序的基本元素 ...

    SWT使用例子

    9. **TabItem**: TabItem常用于创建带有多个页面的TabFolder,每个TabItem代表一个单独的页面,用户可以通过点击不同的标签在各个页面间切换。 10. **FillLayout**: FillLayout是一种简单的布局管理器,它使容器内...

    学习SWT,RCP的笔记.doc

    - **TabFolder类和TabItem类**: 用于实现选项卡界面。 - **SashForm类**: 支持拖动调整子控件大小的容器。 - **ScrolledComposite类**: 带有滚动条的容器。 - **Shell类**: 顶层窗口容器。 ### 七、布局管理器 SWT...

    SWT开发参考文档

    - **Widgets**:SWT提供了丰富的GUI组件,如按钮、标签、文本框等,这些组件具有良好的本地化外观和行为。 - **布局管理器**:SWT支持多种布局策略,如填充式、行列式、网格式和表格式布局,帮助开发者灵活地组织和...

    Eclipse_Swt_Jface_核心应用_部分19

    6.3 选项卡(TabFolder) 81 6.3.1 选项卡的基本构成 81 6.3.2 设置底部显示选项卡 82 6.3.3 设置选项卡图标 82 6.3.4 选项卡的常用方法 83 6.4 自定义选项卡(CTabFolder ) 83 6.4.1 带有“关闭”按钮...

    SWT开发组件demo

    8. **选项卡(TabFolder)**:`TabFolder`组件可以将多个页面(TabItem)组织成一个选项卡式界面,用户可以通过点击不同的标签切换内容,非常适合展示和管理多个相关但相互独立的信息板块。 9. **高级组件应用**:...

    SWT(JFace)体验之StackLayout布局

    这种布局方式常用于那些需要在有限空间内切换不同视图或内容的界面,例如选项卡式界面,尽管SWT提供了更专业的TabFolder组件来实现这一功能,但StackLayout提供了一种简洁的替代方案。 总结来说,StackLayout是SWT...

    eclipse开发技术详解第6章 容器

    选项卡容器`TabFolder`允许创建具有多个页面(标签页)的组件,每个页面可以包含不同的组件。`TabItem`表示单个标签页。常用方法如`getItem(int index)`获取指定索引的标签页,`getSelection()`获取当前选中的标签页...

    Eclipse SWT 开发参考

    - **TabFolder组件**:用于创建带标签页的容器。 - **MessageBox组件**:用于创建消息对话框。 - **ColorDialog、FontDialog等对话框组件**:用于创建颜色选择器、字体选择器等对话框。 - **FileDialog控件**:用于...

    simple.zip

    swt常有控件入门demo Button1.java Canvas1.java Combo1.java Menu1.java SashForm1.java ScrolledComposite1.java SimpleEditor1.java SimpleEditor2.java Slider1.java TabFolder1.java ToolBarExample.java ...

    SWT教程之FormLayout介绍

    在给出的部分源代码中,可以看到作者构建了一个包含多种组件的复杂窗口,如菜单(`Menu`)、分割窗口(`SashForm`)、树形视图(`Tree`)、标签页(`TabFolder`)以及状态栏(`CoolBar`)。接下来我们将对这部分代码...

    JFace_SWT.doc

    3. **使用命名内部类**: 可以通过内部类的形式来实现事件监听器,并通过构造函数传递需要使用的变量。 ```java class MyListener implements Listener { private String name; public MyListener(String name)...

    SWT&JFACE GEF or Eclipse Platform

    SWT通过使用原生控件(native widgets)来解决这个问题,只有在目标平台没有对应控件时才会进行模拟,以确保应用的界面风格和性能接近于本地应用程序。 ### SWT快速入门 #### SWT组件 - **Button**: 创建按钮,...

    swt-starter-v2

    在这个项目中,我们重点关注的是"CSS"这一标签,它在SWT中的应用为我们带来了更高级的界面定制能力。 在传统的SWT应用中,界面样式通常依赖于平台的默认设置,这可能导致跨平台应用的界面一致性较差。引入CSS...

    org.eclipse.swt.win32

    org.eclipse.swt.SWT.class org.eclipse.swt.SWTError.class org.eclipse.swt.SWTException.class org.eclipse.swt.accessibility.ACC.class org.eclipse.swt.accessibility.Accessible.class org.eclipse.swt....

Global site tag (gtag.js) - Google Analytics