您的位置:首页 > 编程语言 > Java开发

Java SWT 文本框 垂直 居中

2016-08-10 16:56 267 查看
项目需要一个垂直居中的text,翻了很多帖子,没发现有实现。

自己写一个。

具体用法和SWT Text的用法一样,当然没有把所有的text的功能加入。如果有发现还有常用的功能未曾实现,可以@我

代码如下:

package test;

/**

 * NewText:支持垂直居中的Text;

 * 说明:不支持换行;

 * @author Ray

 */

import org.eclipse.swt.SWT;

import org.eclipse.swt.events.ControlEvent;

import org.eclipse.swt.events.ControlListener;

import org.eclipse.swt.events.FocusEvent;

import org.eclipse.swt.events.FocusListener;

import org.eclipse.swt.events.ModifyListener;

import org.eclipse.swt.events.MouseEvent;

import org.eclipse.swt.events.MouseListener;

import org.eclipse.swt.events.MouseTrackListener;

import org.eclipse.swt.events.SelectionListener;

import org.eclipse.swt.events.VerifyListener;

import org.eclipse.swt.graphics.Color;

import org.eclipse.swt.graphics.Cursor;

import org.eclipse.swt.graphics.Font;

import org.eclipse.swt.graphics.Point;

import org.eclipse.swt.widgets.Composite;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Event;

import org.eclipse.swt.widgets.Text;

public class NewText extends Composite implements ControlListener, MouseTrackListener, MouseListener {

private Text text;
private int style;
private Color textBackground;
private Color background;

private int rightPadding = 0;
private int leftPadding = 0;

public NewText(Composite parent, int style) {
super(parent, style);
this.style = style;
this.setCursor(new Cursor(Display.getDefault(), SWT.CURSOR_IBEAM));
createText(style);
textBackground = text.getBackground();
background =new Color(getDisplay(), 255, 255, 255);
super.setBackground(background);
addControlListener(this);
addMouseTrackListener(this);
addMouseListener(this);
textAddListener();
}

private void createText(int style) {
if (hasBorder())
text = new Text(this, setBorderBitTo0(style));
else
text = new Text(this, style);
}

private void textAddListener() {
text.addMouseTrackListener(this);
text.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
setLostBackground();
}

@Override
public void focusGained(FocusEvent e) {
setGainedBackground();
}
});
}

/**
* 去掉style中的SWT.BORDER

* @return
*/

private int setBorderBitTo0(int style) {
return style & ~SWT.BORDER;
}

/**
* 判断传入的style是否包含边框

* @return
*/

private boolean hasBorder() {
return (style & SWT.BORDER) != 0;
}

@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
Point pt = text.computeSize(wHint, hHint);
return new Point(pt.x + 4, pt.y + 4);
}

@Override
public void controlMoved(ControlEvent e) {
}

@Override
public void controlResized(ControlEvent e) {
setTextBounds();
}

private int getY() {
return (getSize().y - text.getSize().y) / 2;
}

private void setTextBounds() {
text.pack();
if (hasBorder()) {
text.setLocation(2 + leftPadding, getY() - 2);
text.setSize(getBounds().width - 8 + (rightPadding + leftPadding), text.getSize().y);
} else {
text.setLocation(0 + leftPadding, getY());
text.setSize(getBounds().width - 2 + (rightPadding + leftPadding), text.getSize().y);
}
}

@Override
public void pack() {
text.pack();
if (hasBorder()) {
setSize(text.getSize().x + 4, text.getSize().y + 8);
} else {
setSize(text.getSize().x, text.getSize().y);
}
}

public void setText(String string) {
text.setText(string);
}

public void setFont(Font font) {
text.setFont(font);
setTextBounds();
}

public String getText() {
return text.getText();
}

public void selectAll() {
text.selectAll();
}

public boolean forceFocus() {
return text.forceFocus();
}

public boolean setFocus() {
return text.setFocus();
}

@Override
public void setBackground(Color color) {
textBackground = color;
background = color;
super.setBackground(color);
text.setBackground(color);
}

@Override
public void setForeground(Color color) {
super.setForeground(color);
text.setForeground(color);
}

@Override
public void addFocusListener(FocusListener listener) {
text.addFocusListener(listener);
}

public void addSelectionListener(SelectionListener listener) {
text.addSelectionListener(listener);
}

public void addModifyListener(ModifyListener listener) {
text.addModifyListener(listener);
}

public void addVerifyListener(VerifyListener listener) {
text.addVerifyListener(listener);
}

private void setGainedBackground() {
super.setBackground(textBackground);
}

private void setLostBackground() {
super.setBackground(background);
}

@Override
public void mouseDown(MouseEvent e) {
relocate(e);
}

public void relocate(MouseEvent me) {
if (me.widget != this)
return;

final Point pt = getDisplay().map(this, null, me.x, getSize().y / 2);

Event event = new Event();
event.widget = text;
event.type = SWT.MouseMove;
event.x = pt.x;
event.y = pt.y;
getDisplay().post(event);

event.type = SWT.MouseDown;
event.button = 1;
getDisplay().post(event);

event.type = SWT.MouseUp;
getDisplay().post(event);
}

@Override
public void mouseUp(MouseEvent e) {
}

@Override
public void mouseEnter(MouseEvent e) {
}

@Override
public void mouseExit(MouseEvent e) {

}

@Override
public void mouseHover(MouseEvent e) {

}

@Override
public void mouseDoubleClick(MouseEvent e) {

}

public int getRightPadding() {
return rightPadding;
}

public void setRightPadding(int rightPadding) {
this.rightPadding = rightPadding;
}

public int getLeftPadding() {
return leftPadding;
}

public void setLeftPadding(int leftPadding) {
this.leftPadding = leftPadding;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swt text 垂直居中