Java Tutorial/SWT
- ApplicationWindow
- Browser
- BusyIndicator
- Button
- Button Event
- CLabel
- CTabFolder
- CTabItem
- Canvas
- Caret
- Clipboard
- ColorDialog
- Combo
- Combo Event
- CommonDialog
- Composite
- ControlEditor
- CoolBar
- CoolItem
- Custom Layout
- DateTime
- Decorations
- Device
- Dialog
- DirectoryDialog
- Display
- ExpandBar
- File Tree
- FileDialog
- FillLayout
- FocusEvent
- FormLayout
- GridData
- GridLayout
- Group
- ImageRegistry
- JFace Introduction
- KeyEvent
- Label
- Layout Basics
- Link
- List
- List Event
- Menu
- MenuEvent
- MenuItem
- MenuItem Event
- MessageBox
- MouseEvent
- PasswordField
- PopupList
- PopupMenu
- PrintDialog
- PrinterData
- Program
- ProgressBar
- RowLayout
- SWT AWT Swing
- SWT Basics
- SWT Color
- SWT Cursor
- SWT Drag Drop
- SWT Event
- SWT Image
- SWT NO Layout
- SWT Thread
- SWT Timer
- Sash
- Sash Event
- SashForm
- Scale
- Screen Capture
- ScrollBar
- ScrollBar Event
- ScrolledComposite
- Separator
- Shell
- Shell Event
- Slider
- Slider Event
- Spinner
- Spinner Event
- Splash Screen
- StackLayout
- StyledText
- StyledText Action
- StyledText Event
- StyledText Format
- StyledText LineStyle
- StyledText Style
- System Tray
- TabFolder
- TabItem
- TabSequence
- Table
- Table Cursor
- Table Editor
- Table Event
- Table Renderer
- Table Sort
- TableColumn
- TableItem
- Text
- Text Event
- TextLayout
- ToolBar
- ToolItem
- ToolTip
- Tooltip Balloon
- Tracker
- Tree
- Tree Editor
- Tree Event
- TreeColumn TreeTable
- TreeItem
- TreeViewer
- UI Auto
- ViewForm
- WIN32
- Widget
- WindowManagers
Содержание
17. Choosing a Font
SWT provides the FontDialog class to display the common font selection dialog. FontDialog"s open() method returns a FontData object (or null if the user cancels the dialog), which you can use to create a Font.
SWT uses two classes to represent fonts:
- Font represents the onscreen font, and
- Font objects represent operating system resources, and you must dispose any you create.
- FontData represents the data used to construct the onscreen font.
- FontData objects contain only data, and aren"t operating system resources, so they aren"t disposed.
<source lang="java">
import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FontDialog; import org.eclipse.swt.widgets.Shell; public class FontSelectionDialogDisplay {
public static void main(String[] args) { Display display = new Display(); final Shell shell = new Shell(display); FontDialog dlg = new FontDialog(shell); FontData fontData = dlg.open(); if (fontData != null) { Font font = new Font(shell.getDisplay(), fontData); font.dispose(); } display.dispose(); }
}</source>
Caution: Don"t dispose a font while your application is still using it.
17. Construct a FontData object
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class FontDataConstruct {
public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setText("Canvas Example"); shell.setLayout(new FillLayout()); Canvas canvas = new Canvas(shell, SWT.NONE); canvas.addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { Font font = new Font(shell.getDisplay(), new FontData("Helvetica", 18, SWT.NORMAL)); e.gc.setFont(font); e.gc.drawText("My Text", 0, 0); font.dispose(); } }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); }
}</source>
Create Larger Font
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class FontLargerCreate {
public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); Text text = new Text(shell, SWT.MULTI|SWT.BORDER); text.setBounds(10, 10, 150, 150); Font initialFont = text.getFont(); FontData[] fontData = initialFont.getFontData(); for (int i = 0; i < fontData.length; i++) { fontData[i].setHeight(24); } Font newFont = new Font(display, fontData); text.setFont(newFont); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } newFont.dispose(); display.dispose(); }
}</source>
17. To use the font selection dialog to change both the font and the color of a label
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FontDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; public class FontDialogColorFontData {
public static void main(String[] args) { Display display = new Display(); final Shell shell = new Shell(display); shell.setText("Font Chooser"); shell.setLayout(new GridLayout(2, false)); final Label fontLabel = new Label(shell, SWT.NONE); fontLabel.setText("The selected font"); Button button = new Button(shell, SWT.PUSH); button.setText("Font..."); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { Font font = null; Color color = null; FontDialog dlg = new FontDialog(shell); if (font != null) dlg.setFontList(fontLabel.getFont().getFontData()); if (color != null) dlg.setRGB(color.getRGB()); if (dlg.open() != null) { if (font != null) font.dispose(); if (color != null) color.dispose(); font = new Font(shell.getDisplay(), dlg.getFontList()); fontLabel.setFont(font); color = new Color(shell.getDisplay(), dlg.getRGB()); fontLabel.setForeground(color); shell.pack(); if (font != null) font.dispose(); if (color != null) color.dispose(); } } }); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); }
}</source>
17. Using the FontRegistry
- FontData class is a lightweight class describing system fonts.
- A FontData to a Font is analogous to an ImageDescriptor to an Image.
- A FontData class describes the following properties of a Font:
- name
- height
- style: combination of SWT.NORMAL, SWT.ITALIC, and SWT.BOLD
The Font itself is resource-based, i.e., if you create it, you must dispose of it. You can use FontRegistry to manage allocation and disposal of the fonts.
<source lang="java">
import org.eclipse.jface.resource.FontRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class FontRegistry {
public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(); shell.setLayout(new GridLayout(1, false)); FontRegistry fontRegistry = new FontRegistry(display); fontRegistry.put("button-text", new FontData[] { new FontData("Arial", 9, SWT.BOLD) }); fontRegistry.put("code", new FontData[] { new FontData("Courier New", 10, SWT.NORMAL) }); Text text = new Text(shell, SWT.MULTI | SWT.BORDER | SWT.WRAP); text.setFont(fontRegistry.get("code")); text.setForeground(display.getSystemColor(SWT.COLOR_BLUE)); text.setText(""); GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; text.setLayoutData(gd); Button executeButton = new Button(shell, SWT.PUSH); executeButton.setText("Execute"); executeButton.setFont(fontRegistry.get("button-text")); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); }
}</source>