Java/SWT JFace Eclipse/Spinner
Версия от 18:01, 31 мая 2010; (обсуждение)
Содержание
create and initialize a SWT spinner widget
/*
* Spinner example snippet: create and initialize a spinner widget
*
* For a list of all SWT example snippets see
* http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets
*/
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
public class Snippet184 {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
Spinner spinner = new Spinner(shell, SWT.BORDER);
spinner.setMinimum(0);
spinner.setMaximum(1000);
spinner.setSelection(500);
spinner.setIncrement(1);
spinner.setPageIncrement(100);
spinner.pack();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
Floating point values in SWT Spinner
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
/*
* Floating point values in Spinner
*
* For a list of all SWT example snippets see
* http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets
*/
public class Snippet190 {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Spinner with float values");
shell.setLayout(new GridLayout());
final Spinner spinner = new Spinner(shell, SWT.NONE);
// allow 3 decimal places
spinner.setDigits(3);
// set the minimum value to 0.001
spinner.setMinimum(1);
// set the maximum value to 20
spinner.setMaximum(20000);
// set the increment value to 0.010
spinner.setIncrement(10);
// set the seletion to 3.456
spinner.setSelection(3456);
spinner.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
int selection = spinner.getSelection();
int digits = spinner.getDigits();
System.out.println("Selection is "
+ (selection / Math.pow(10, digits)));
}
});
shell.setSize(200, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
SWT Spinner Sample
/*
*
* (c) Copyright IBM Corp. 2000, 2001.
*
* All Rights Reserved.
*
*/
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.ruposite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TypedListener;
public class Spinner extends Composite {
static final int BUTTON_WIDTH = 16;
Text text;
Button up, down;
int minimum, maximum;
public Spinner(Composite parent, int style) {
super(parent, style);
text = new Text(this, style | SWT.SINGLE | SWT.BORDER);
up = new Button(this, style | SWT.ARROW | SWT.UP);
down = new Button(this, style | SWT.ARROW | SWT.DOWN);
text.addListener(SWT.Verify, new Listener() {
public void handleEvent(Event e) {
verify(e);
}
});
text.addListener(SWT.Traverse, new Listener() {
public void handleEvent(Event e) {
traverse(e);
}
});
up.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
up();
}
});
down.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
down();
}
});
addListener(SWT.Resize, new Listener() {
public void handleEvent(Event e) {
resize();
}
});
addListener(SWT.FocusIn, new Listener() {
public void handleEvent(Event e) {
focusIn();
}
});
text.setFont(getFont());
minimum = 0;
maximum = 9;
setSelection(minimum);
}
void verify(Event e) {
try {
Integer.parseInt(e.text);
} catch (NumberFormatException ex) {
e.doit = false;
}
}
void traverse(Event e) {
switch (e.detail) {
case SWT.TRAVERSE_ARROW_PREVIOUS:
if (e.keyCode == SWT.ARROW_UP) {
e.doit = true;
e.detail = SWT.NULL;
up();
}
break;
case SWT.TRAVERSE_ARROW_NEXT:
if (e.keyCode == SWT.ARROW_DOWN) {
e.doit = true;
e.detail = SWT.NULL;
down();
}
break;
}
}
void up() {
setSelection(getSelection() + 1);
notifyListeners(SWT.Selection, new Event());
}
void down() {
setSelection(getSelection() - 1);
notifyListeners(SWT.Selection, new Event());
}
void focusIn() {
text.setFocus();
}
public void setFont(Font font) {
super.setFont(font);
text.setFont(font);
}
public void setSelection(int selection) {
if (selection < minimum) {
selection = minimum;
} else if (selection > maximum) {
selection = maximum;
}
text.setText(String.valueOf(selection));
text.selectAll();
text.setFocus();
}
public int getSelection() {
return Integer.parseInt(text.getText());
}
public void setMaximum(int maximum) {
checkWidget();
this.maximum = maximum;
resize();
}
public int getMaximum() {
return maximum;
}
public void setMinimum(int minimum) {
this.minimum = minimum;
}
public int getMinimum() {
return minimum;
}
void resize() {
Point pt = computeSize(SWT.DEFAULT, SWT.DEFAULT);
int textWidth = pt.x - BUTTON_WIDTH;
int buttonHeight = pt.y / 2;
text.setBounds(0, 0, textWidth, pt.y);
up.setBounds(textWidth, 0, BUTTON_WIDTH, buttonHeight);
down.setBounds(textWidth, pt.y - buttonHeight, BUTTON_WIDTH,
buttonHeight);
}
public Point computeSize(int wHint, int hHint, boolean changed) {
GC gc = new GC(text);
Point textExtent = gc.textExtent(String.valueOf(maximum));
gc.dispose();
Point pt = text.ruputeSize(textExtent.x, textExtent.y);
int width = pt.x + BUTTON_WIDTH;
int height = pt.y;
if (wHint != SWT.DEFAULT)
width = wHint;
if (hHint != SWT.DEFAULT)
height = hHint;
return new Point(width, height);
}
public void addSelectionListener(SelectionListener listener) {
if (listener == null)
throw new SWTError(SWT.ERROR_NULL_ARGUMENT);
addListener(SWT.Selection, new TypedListener(listener));
}
}
SWT Spinner Test
/*
* (c) Copyright IBM Corp. 2000, 2001. All Rights Reserved.
*/
import java.util.Hashtable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.ruposite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TypedListener;
public class SpinnerTest {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new RowLayout());
final Spinner spinner = new Spinner(shell, 0);
spinner.setMaximum(999);
System.out.println("max set to " + spinner.getMaximum());
spinner.setSelection(500);
System.out.println("selection set to " + spinner.getSelection());
spinner.setMinimum(100);
System.out.println("min set to " + spinner.getMinimum());
Font font = new Font(display, "Courier", 20, SWT.NORMAL);
spinner.setFont(font);
spinner.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
System.out.println(spinner.getSelection());
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
font.dispose();
}
}
class Spinner extends Composite {
int handleSpinner;
static Hashtable table = new Hashtable();
static {
System.loadLibrary("spinner");
}
public Spinner(Composite parent, int style) {
super(parent, style);
int handleParent = handle;
handleSpinner = createControl(handleParent);
if (handleSpinner == 0)
SWT.error(SWT.ERROR_NO_HANDLES);
table.put(new Integer(handleSpinner), this);
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
Spinner.this.widgetDisposed(e);
}
});
addControlListener(new ControlAdapter() {
public void controlResized(ControlEvent e) {
Spinner.this.controlResized(e);
}
});
addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
Spinner.this.focusGained(e);
}
});
Font font = getFont();
setFont(handleSpinner, font.handle);
}
public void setFont(Font font) {
super.setFont(font);
int hFont = 0;
if (font != null)
hFont = font.handle;
setFont(handleSpinner, hFont);
}
public int getSelection() {
checkWidget();
return getPosition(handleSpinner);
}
public void setSelection(int selection) {
checkWidget();
setPosition(handleSpinner, selection);
}
public void setMaximum(int maximum) {
checkWidget();
setMaximum(handleSpinner, maximum);
}
public int getMaximum() {
checkWidget();
return getMaximum(handleSpinner);
}
public void setMinimum(int minimum) {
checkWidget();
setMinimum(handleSpinner, minimum);
}
public int getMinimum() {
checkWidget();
return getMinimum(handleSpinner);
}
public void widgetDisposed(DisposeEvent e) {
table.remove(new Integer(handleSpinner));
handleSpinner = 0;
}
public void controlResized(ControlEvent e) {
Rectangle rect = getClientArea();
resizeControl(handleSpinner, rect.x, rect.y, rect.width, rect.height);
}
public void focusGained(FocusEvent e) {
setFocus(handleSpinner);
}
public Point computeSize(int wHint, int hHint, boolean changed) {
checkWidget();
int[] result = new int[2];
computeSize(handleSpinner, result);
if (wHint != SWT.DEFAULT)
result[0] = wHint;
if (hHint != SWT.DEFAULT)
result[1] = hHint;
int border = getBorderWidth();
return new Point(result[0] + border * 2, result[1] + border * 2);
}
public void addSelectionListener(SelectionListener listener) {
if (listener == null)
throw new SWTError(SWT.ERROR_NULL_ARGUMENT);
addListener(SWT.Selection, new TypedListener(listener));
}
static void widgetSelected(int handle) {
Spinner spinner = (Spinner) table.get(new Integer(handle));
if (spinner == null)
return;
spinner.notifyListeners(SWT.Selection, new Event());
}
/** ********* JAVA NATIVES *********** */
static final native int createControl(int handle);
static final native void computeSize(int handle, int[] result);
static final native void resizeControl(int handle, int x, int y, int width,
int height);
static final native void setPosition(int handle, int position);
static final native int getPosition(int handle);
static final native void setMaximum(int handle, int max);
static final native int getMaximum(int handle);
static final native void setMinimum(int handle, int min);
static final native int getMinimum(int handle);
static final native void setFont(int handle, int hFont);
static final native void setFocus(int handle);
}