?? swingbuilder.java
字號:
protected void nodeCompleted(Object parent, Object node) {
// set models after the node has been completed
if (node instanceof TableModel && parent instanceof JTable) {
JTable table = (JTable) parent;
TableModel model = (TableModel) node;
table.setModel(model);
}
if (node instanceof Startable) {
Startable startable = (Startable) node;
startable.start();
}
if (node instanceof Window) {
if (!containingWindows.isEmpty() && containingWindows.getLast() == node) {
containingWindows.removeLast();
}
}
}
protected Object createNode(Object name) {
return createNode(name, Collections.EMPTY_MAP);
}
protected Object createNode(Object name, Object value) {
if (passThroughNodes.containsKey(name) && (value != null) && ((Class)passThroughNodes.get(name)).isAssignableFrom(value.getClass())) {
// value may need to go into containing windows list
if (value instanceof Window) {
containingWindows.add(value);
}
return value;
}
else if (value instanceof String) {
Object widget = createNode(name);
if (widget != null) {
InvokerHelper.invokeMethod(widget, "setText", value);
}
return widget;
}
else {
throw new MissingMethodException((String) name, getClass(), new Object[] {value}, false);
}
}
protected Object createNode(Object name, Map attributes, Object value) {
if (passThroughNodes.containsKey(name) && (value != null) && ((Class)passThroughNodes.get(name)).isAssignableFrom(value.getClass())) {
// value may need to go into containing windows list
if (value instanceof Window) {
containingWindows.add(value);
}
handleWidgetAttributes(value, attributes);
return value;
}
else {
Object widget = createNode(name, attributes);
if (widget != null) {
InvokerHelper.invokeMethod(widget, "setText", value.toString());
}
return widget;
}
}
protected Object createNode(Object name, Map attributes) {
String widgetName = (String) attributes.remove("id");
constraints = attributes.remove("constraints");
Object widget = null;
if (passThroughNodes.containsKey(name)) {
widget = attributes.get(name);
if ((widget != null) && ((Class)passThroughNodes.get(name)).isAssignableFrom(widget.getClass())) {
// value may need to go into containing windows list
if (widget instanceof Window) {
containingWindows.add(widget);
}
attributes.remove(name);
}
else {
widget = null;
}
}
if (widget == null) {
Factory factory = (Factory) factories.get(name);
if (factory != null) {
try {
widget = factory.newInstance(attributes);
if (widgetName != null) {
widgets.put(widgetName, widget);
}
if (widget == null) {
log.log(Level.WARNING, "Factory for name: " + name + " returned null");
}
else {
if (log.isLoggable(Level.FINE)) {
log.fine("For name: " + name + " created widget: " + widget);
}
}
}
catch (Exception e) {
throw new RuntimeException("Failed to create component for" + name + " reason: " + e, e);
}
}
else {
log.log(Level.WARNING, "Could not find match for name: " + name);
}
}
handleWidgetAttributes(widget, attributes);
return widget;
}
protected void handleWidgetAttributes(Object widget, Map attributes) {
if (widget != null) {
if (widget instanceof Action) {
/** @todo we could move this custom logic into the MetaClass for Action */
Action action = (Action) widget;
Closure closure = (Closure) attributes.remove("closure");
if (closure != null && action instanceof DefaultAction) {
DefaultAction defaultAction = (DefaultAction) action;
defaultAction.setClosure(closure);
}
Object accel = attributes.remove("accelerator");
KeyStroke stroke = null;
if (accel instanceof KeyStroke) {
stroke = (KeyStroke) accel;
} else if (accel != null) {
stroke = KeyStroke.getKeyStroke(accel.toString());
}
action.putValue(Action.ACCELERATOR_KEY, stroke);
Object mnemonic = attributes.remove("mnemonic");
if ((mnemonic != null) && !(mnemonic instanceof Number)) {
mnemonic = new Integer(mnemonic.toString().charAt(0));
}
action.putValue(Action.MNEMONIC_KEY, mnemonic);
for (Iterator iter = attributes.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
String actionName = (String) entry.getKey(); // todo dk: misleading naming. this can be any property name
// typically standard Action names start with upper case, so lets upper case it
actionName = capitalize(actionName); // todo dk: in general, this shouldn't be capitalized
Object value = entry.getValue();
action.putValue(actionName, value);
}
}
else {
// some special cases...
if (attributes.containsKey("buttonGroup")) {
Object o = attributes.get("buttonGroup");
if ((o instanceof ButtonGroup) && (widget instanceof AbstractButton)) {
((AbstractButton)widget).getModel().setGroup((ButtonGroup)o);
attributes.remove("buttonGroup");
}
}
// this next statement nd if/else is a workaround until GROOVY-305 is fixed
Object mnemonic = attributes.remove("mnemonic");
if ((mnemonic != null) && (mnemonic instanceof Number)) {
InvokerHelper.setProperty(widget, "mnemonic", new Character((char)((Number)mnemonic).intValue()));
}
else if (mnemonic != null) {
InvokerHelper.setProperty(widget, "mnemonic", new Character(mnemonic.toString().charAt(0)));
}
// set the properties
for (Iterator iter = attributes.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
String property = entry.getKey().toString();
Object value = entry.getValue();
InvokerHelper.setProperty(widget, property, value);
}
}
}
}
protected String capitalize(String text) {
char ch = text.charAt(0);
if (Character.isUpperCase(ch)) {
return text;
}
StringBuffer buffer = new StringBuffer(text.length());
buffer.append(Character.toUpperCase(ch));
buffer.append(text.substring(1));
return buffer.toString();
}
protected void registerWidgets() {
//
// non-widget support classes
//
registerBeanFactory("action", DefaultAction.class);
passThroughNodes.put("action", javax.swing.Action.class);
registerBeanFactory("buttonGroup", ButtonGroup.class);
registerFactory("map", new Factory() { // todo dk: is that still needed?
public Object newInstance(Map properties)
throws InstantiationException, InstantiationException, IllegalAccessException {
return properties;
}
});
// ulimate pass through type
passThroughNodes.put("widget", java.awt.Component.class);
//
// standalone window classes
//
registerFactory("dialog", new Factory() {
public Object newInstance(Map properties)
throws InstantiationException, InstantiationException, IllegalAccessException {
return createDialog(properties);
}
});
registerFactory("frame", new Factory() {
public Object newInstance(Map properties)
throws InstantiationException, InstantiationException, IllegalAccessException {
return createFrame(properties);
}
});
registerBeanFactory("fileChooser", JFileChooser.class);
registerFactory("frame", new Factory() { // todo dk: frame registered twice ???
public Object newInstance(Map properties)
throws InstantiationException, InstantiationException, IllegalAccessException {
return createFrame(properties);
}
});
registerBeanFactory("optionPane", JOptionPane.class);
registerFactory("window", new Factory() {
public Object newInstance(Map properties)
throws InstantiationException, InstantiationException, IllegalAccessException {
return createWindow(properties);
}
});
//
// widgets
//
registerBeanFactory("button", JButton.class);
registerBeanFactory("checkBox", JCheckBox.class);
registerBeanFactory("checkBoxMenuItem", JCheckBoxMenuItem.class);
registerBeanFactory("colorChooser", JColorChooser.class);
registerFactory("comboBox", new Factory() {
public Object newInstance(Map properties)
throws InstantiationException, InstantiationException, IllegalAccessException {
return createComboBox(properties);
}
});
registerBeanFactory("desktopPane", JDesktopPane.class);
registerBeanFactory("editorPane", JEditorPane.class);
registerFactory("formattedTextField", new Factory() {
public Object newInstance(Map properties)
throws InstantiationException, InstantiationException, IllegalAccessException {
return createFormattedTextField(properties);
}
});
registerBeanFactory("internalFrame", JInternalFrame.class);
registerBeanFactory("label", JLabel.class);
registerBeanFactory("layeredPane", JLayeredPane.class);
registerBeanFactory("list", JList.class);
registerBeanFactory("menu", JMenu.class);
registerBeanFactory("menuBar", JMenuBar.class);
registerBeanFactory("menuItem", JMenuItem.class);
registerBeanFactory("panel", JPanel.class);
registerBeanFactory("passwordField", JPasswordField.class);
registerBeanFactory("popupMenu", JPopupMenu.class);
registerBeanFactory("progressBar", JProgressBar.class);
registerBeanFactory("radioButton", JRadioButton.class);
registerBeanFactory("radioButtonMenuItem", JRadioButtonMenuItem.class);
registerBeanFactory("scrollBar", JScrollBar.class);
registerBeanFactory("scrollPane", JScrollPane.class);
registerBeanFactory("separator", JSeparator.class);
registerBeanFactory("slider", JSlider.class);
registerBeanFactory("spinner", JSpinner.class);
registerFactory("splitPane", new Factory() {
public Object newInstance(Map properties) {
JSplitPane answer = new JSplitPane();
answer.setLeftComponent(null);
answer.setRightComponent(null);
answer.setTopComponent(null);
answer.setBottomComponent(null);
return answer;
}
});
registerBeanFactory("tabbedPane", JTabbedPane.class);
registerBeanFactory("table", JTable.class);
registerBeanFactory("textArea", JTextArea.class);
registerBeanFactory("textPane", JTextPane.class);
registerBeanFactory("textField", JTextField.class);
registerBeanFactory("toggleButton", JToggleButton.class);
registerBeanFactory("toolBar", JToolBar.class);
//registerBeanFactory("tooltip", JToolTip.class); // doens't work, user toolTipText property
registerBeanFactory("tree", JTree.class);
registerBeanFactory("viewport", JViewport.class); // sub class?
//
// MVC models
//
registerBeanFactory("boundedRangeModel", DefaultBoundedRangeModel.class);
// spinner models
registerBeanFactory("spinnerDateModel", SpinnerDateModel.class);
registerBeanFactory("spinnerListModel", SpinnerListModel.class);
registerBeanFactory("spinnerNumberModel", SpinnerNumberModel.class);
// table models
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -