有问题的Eclipse窗口构建复合

我遇到一些问题,窗口生成器例如: https://developers.google.com/web-toolkit/tools/gwtdesigner/features/custom_composites有问题的Eclipse窗口构建复合

当我复制代码到我的Eclipse,我在代码中的错误:

customComposite.setFirstFieldBackground(SWTResourceManager 

.getColor(SWT.COLOR_YELLOW));

的Eclipse告诉我没有SWTResourceManager。

当我试图表现出在设计模式的形式,在代码中的另一个错误occours:

final Label thirdFieldLabel = new Label(customComposite.getComposite(), 

SWT.NONE);

thirdFieldLabel.setText("Third Field");

错误: org.eclipse.wb.internal.core.utils.exception.DesignerException:2005(空作为父参数。)。

考虑到这个例子在Web中很常见,即使在自己的WindowBuilder的帮助文件中,我也没有将正确的设置/文件添加到我的应用程序中。

我会做什么不同?谢谢!

回答:

正在发生的事情是,SWTResourceManager是在插件当您使用设计视图,设置东西创建的类像颜色,它是特定于你的插件。因此,当您将代码复制到引用该类的另一个插件中时,您将得到一个未找到类的异常。最简单的事情就是复制代码。删除设置的颜色,在新插件中设置编辑器中的颜色,并为该插件自动创建一个SWTResourceManager。第二个NPE不确定听起来与环境有关,但根据经验,swt资源管理器是捆绑特定的。

回答:

当您使用Eclipse向导(File> New> Other> WindowBuilder> SWTDesigner)创建新的WindowBuilder项目时,SWTResourceManager类通常在com.swtdesigner包中生成。

尝试使用此向导生成项目。

如果你还没有在这里生成的这个类是其代码:

package com.swtdesigner; 

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.HashMap;

import java.util.Map;

import org.eclipse.swt.SWT;

import org.eclipse.swt.graphics.Color;

import org.eclipse.swt.graphics.Cursor;

import org.eclipse.swt.graphics.Font;

import org.eclipse.swt.graphics.FontData;

import org.eclipse.swt.graphics.GC;

import org.eclipse.swt.graphics.Image;

import org.eclipse.swt.graphics.ImageData;

import org.eclipse.swt.graphics.RGB;

import org.eclipse.swt.graphics.Rectangle;

import org.eclipse.swt.widgets.Display;

/**

* Utility class for managing OS resources associated with SWT controls such as colors, fonts, images, etc.

* <p>

* !!! IMPORTANT !!! Application code must explicitly invoke the <code>dispose()</code> method to release the

* operating system resources managed by cached objects when those objects and OS resources are no longer

* needed (e.g. on application shutdown)

* <p>

* This class may be freely distributed as part of any application or plugin.

* <p>

* @author scheglov_ke

* @author Dan Rubel

*/

public class SWTResourceManager {

////////////////////////////////////////////////////////////////////////////

//

// Color

//

////////////////////////////////////////////////////////////////////////////

private static Map<RGB, Color> m_colorMap = new HashMap<RGB, Color>();

/**

* Returns the system {@link Color} matching the specific ID.

*

* @param systemColorID

* the ID value for the color

* @return the system {@link Color} matching the specific ID

*/

public static Color getColor(int systemColorID) {

Display display = Display.getCurrent();

return display.getSystemColor(systemColorID);

}

/**

* Returns a {@link Color} given its red, green and blue component values.

*

* @param r

* the red component of the color

* @param g

* the green component of the color

* @param b

* the blue component of the color

* @return the {@link Color} matching the given red, green and blue component values

*/

public static Color getColor(int r, int g, int b) {

return getColor(new RGB(r, g, b));

}

/**

* Returns a {@link Color} given its RGB value.

*

* @param rgb

* the {@link RGB} value of the color

* @return the {@link Color} matching the RGB value

*/

public static Color getColor(RGB rgb) {

Color color = m_colorMap.get(rgb);

if (color == null) {

Display display = Display.getCurrent();

color = new Color(display, rgb);

m_colorMap.put(rgb, color);

}

return color;

}

/**

* Dispose of all the cached {@link Color}'s.

*/

public static void disposeColors() {

for (Color color : m_colorMap.values()) {

color.dispose();

}

m_colorMap.clear();

}

////////////////////////////////////////////////////////////////////////////

//

// Image

//

////////////////////////////////////////////////////////////////////////////

/**

* Maps image paths to images.

*/

private static Map<String, Image> m_imageMap = new HashMap<String, Image>();

/**

* Returns an {@link Image} encoded by the specified {@link InputStream}.

*

* @param stream

* the {@link InputStream} encoding the image data

* @return the {@link Image} encoded by the specified input stream

*/

protected static Image getImage(InputStream stream) throws IOException {

try {

Display display = Display.getCurrent();

ImageData data = new ImageData(stream);

if (data.transparentPixel > 0) {

return new Image(display, data, data.getTransparencyMask());

}

return new Image(display, data);

} finally {

stream.close();

}

}

/**

* Returns an {@link Image} stored in the file at the specified path.

*

* @param path

* the path to the image file

* @return the {@link Image} stored in the file at the specified path

*/

public static Image getImage(String path) {

Image image = m_imageMap.get(path);

if (image == null) {

try {

image = getImage(new FileInputStream(path));

m_imageMap.put(path, image);

} catch (Exception e) {

image = getMissingImage();

m_imageMap.put(path, image);

}

}

return image;

}

/**

* Returns an {@link Image} stored in the file at the specified path relative to the specified class.

*

* @param clazz

* the {@link Class} relative to which to find the image

* @param path

* the path to the image file, if starts with <code>'/'</code>

* @return the {@link Image} stored in the file at the specified path

*/

public static Image getImage(Class<?> clazz, String path) {

String key = clazz.getName() + '|' + path;

Image image = m_imageMap.get(key);

if (image == null) {

try {

image = getImage(clazz.getResourceAsStream(path));

m_imageMap.put(key, image);

} catch (Exception e) {

image = getMissingImage();

m_imageMap.put(key, image);

}

}

return image;

}

private static final int MISSING_IMAGE_SIZE = 10;

/**

* @return the small {@link Image} that can be used as placeholder for missing image.

*/

private static Image getMissingImage() {

Image image = new Image(Display.getCurrent(), MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);

//

GC gc = new GC(image);

gc.setBackground(getColor(SWT.COLOR_RED));

gc.fillRectangle(0, 0, MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);

gc.dispose();

//

return image;

}

/**

* Style constant for placing decorator image in top left corner of base image.

*/

public static final int TOP_LEFT = 1;

/**

* Style constant for placing decorator image in top right corner of base image.

*/

public static final int TOP_RIGHT = 2;

/**

* Style constant for placing decorator image in bottom left corner of base image.

*/

public static final int BOTTOM_LEFT = 3;

/**

* Style constant for placing decorator image in bottom right corner of base image.

*/

public static final int BOTTOM_RIGHT = 4;

/**

* Internal value.

*/

protected static final int LAST_CORNER_KEY = 5;

/**

* Maps images to decorated images.

*/

@SuppressWarnings("unchecked")

private static Map<Image, Map<Image, Image>>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY];

/**

* Returns an {@link Image} composed of a base image decorated by another image.

*

* @param baseImage

* the base {@link Image} that should be decorated

* @param decorator

* the {@link Image} to decorate the base image

* @return {@link Image} The resulting decorated image

*/

public static Image decorateImage(Image baseImage, Image decorator) {

return decorateImage(baseImage, decorator, BOTTOM_RIGHT);

}

/**

* Returns an {@link Image} composed of a base image decorated by another image.

*

* @param baseImage

* the base {@link Image} that should be decorated

* @param decorator

* the {@link Image} to decorate the base image

* @param corner

* the corner to place decorator image

* @return the resulting decorated {@link Image}

*/

public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) {

if (corner <= 0 || corner >= LAST_CORNER_KEY) {

throw new IllegalArgumentException("Wrong decorate corner");

}

Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[corner];

if (cornerDecoratedImageMap == null) {

cornerDecoratedImageMap = new HashMap<Image, Map<Image, Image>>();

m_decoratedImageMap[corner] = cornerDecoratedImageMap;

}

Map<Image, Image> decoratedMap = cornerDecoratedImageMap.get(baseImage);

if (decoratedMap == null) {

decoratedMap = new HashMap<Image, Image>();

cornerDecoratedImageMap.put(baseImage, decoratedMap);

}

//

Image result = decoratedMap.get(decorator);

if (result == null) {

Rectangle bib = baseImage.getBounds();

Rectangle dib = decorator.getBounds();

//

result = new Image(Display.getCurrent(), bib.width, bib.height);

//

GC gc = new GC(result);

gc.drawImage(baseImage, 0, 0);

if (corner == TOP_LEFT) {

gc.drawImage(decorator, 0, 0);

} else if (corner == TOP_RIGHT) {

gc.drawImage(decorator, bib.width - dib.width, 0);

} else if (corner == BOTTOM_LEFT) {

gc.drawImage(decorator, 0, bib.height - dib.height);

} else if (corner == BOTTOM_RIGHT) {

gc.drawImage(decorator, bib.width - dib.width, bib.height - dib.height);

}

gc.dispose();

//

decoratedMap.put(decorator, result);

}

return result;

}

/**

* Dispose all of the cached {@link Image}'s.

*/

public static void disposeImages() {

// dispose loaded images

{

for (Image image : m_imageMap.values()) {

image.dispose();

}

m_imageMap.clear();

}

// dispose decorated images

for (int i = 0; i < m_decoratedImageMap.length; i++) {

Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[i];

if (cornerDecoratedImageMap != null) {

for (Map<Image, Image> decoratedMap : cornerDecoratedImageMap.values()) {

for (Image image : decoratedMap.values()) {

image.dispose();

}

decoratedMap.clear();

}

cornerDecoratedImageMap.clear();

}

}

}

////////////////////////////////////////////////////////////////////////////

//

// Font

//

////////////////////////////////////////////////////////////////////////////

/**

* Maps font names to fonts.

*/

private static Map<String, Font> m_fontMap = new HashMap<String, Font>();

/**

* Maps fonts to their bold versions.

*/

private static Map<Font, Font> m_fontToBoldFontMap = new HashMap<Font, Font>();

/**

* Returns a {@link Font} based on its name, height and style.

*

* @param name

* the name of the font

* @param height

* the height of the font

* @param style

* the style of the font

* @return {@link Font} The font matching the name, height and style

*/

public static Font getFont(String name, int height, int style) {

return getFont(name, height, style, false, false);

}

/**

* Returns a {@link Font} based on its name, height and style. Windows-specific strikeout and underline

* flags are also supported.

*

* @param name

* the name of the font

* @param size

* the size of the font

* @param style

* the style of the font

* @param strikeout

* the strikeout flag (warning: Windows only)

* @param underline

* the underline flag (warning: Windows only)

* @return {@link Font} The font matching the name, height, style, strikeout and underline

*/

public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) {

String fontName = name + '|' + size + '|' + style + '|' + strikeout + '|' + underline;

Font font = m_fontMap.get(fontName);

if (font == null) {

FontData fontData = new FontData(name, size, style);

if (strikeout || underline) {

try {

Class<?> logFontClass = Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); //$NON-NLS-1$

Object logFont = FontData.class.getField("data").get(fontData); //$NON-NLS-1$

if (logFont != null && logFontClass != null) {

if (strikeout) {

logFontClass.getField("lfStrikeOut").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$

}

if (underline) {

logFontClass.getField("lfUnderline").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$

}

}

} catch (Throwable e) {

System.err

.println("Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); //$NON-NLS-1$ //$NON-NLS-2$

}

}

font = new Font(Display.getCurrent(), fontData);

m_fontMap.put(fontName, font);

}

return font;

}

/**

* Returns a bold version of the given {@link Font}.

*

* @param baseFont

* the {@link Font} for which a bold version is desired

* @return the bold version of the given {@link Font}

*/

public static Font getBoldFont(Font baseFont) {

Font font = m_fontToBoldFontMap.get(baseFont);

if (font == null) {

FontData fontDatas[] = baseFont.getFontData();

FontData data = fontDatas[0];

font = new Font(Display.getCurrent(), data.getName(), data.getHeight(), SWT.BOLD);

m_fontToBoldFontMap.put(baseFont, font);

}

return font;

}

/**

* Dispose all of the cached {@link Font}'s.

*/

public static void disposeFonts() {

// clear fonts

for (Font font : m_fontMap.values()) {

font.dispose();

}

m_fontMap.clear();

// clear bold fonts

for (Font font : m_fontToBoldFontMap.values()) {

font.dispose();

}

m_fontToBoldFontMap.clear();

}

////////////////////////////////////////////////////////////////////////////

//

// Cursor

//

////////////////////////////////////////////////////////////////////////////

/**

* Maps IDs to cursors.

*/

private static Map<Integer, Cursor> m_idToCursorMap = new HashMap<Integer, Cursor>();

/**

* Returns the system cursor matching the specific ID.

*

* @param id

* int The ID value for the cursor

* @return Cursor The system cursor matching the specific ID

*/

public static Cursor getCursor(int id) {

Integer key = Integer.valueOf(id);

Cursor cursor = m_idToCursorMap.get(key);

if (cursor == null) {

cursor = new Cursor(Display.getDefault(), id);

m_idToCursorMap.put(key, cursor);

}

return cursor;

}

/**

* Dispose all of the cached cursors.

*/

public static void disposeCursors() {

for (Cursor cursor : m_idToCursorMap.values()) {

cursor.dispose();

}

m_idToCursorMap.clear();

}

////////////////////////////////////////////////////////////////////////////

//

// General

//

////////////////////////////////////////////////////////////////////////////

/**

* Dispose of cached objects and their underlying OS resources. This should only be called when the cached

* objects are no longer needed (e.g. on application shutdown).

*/

public static void dispose() {

disposeColors();

disposeImages();

disposeFonts();

disposeCursors();

}

}

以上是 有问题的Eclipse窗口构建复合 的全部内容, 来源链接: utcz.com/qa/266492.html

回到顶部