使用 JXA 以编程方式创建和填充 NSWindow
Programmatically creating and populating a NSWindow using JXA
我最近了解到存在 JavaScript 自动化。对我来说更有趣的是能够调用 Objective-C APIs, subclass Objective-C classes in JavaScript, 以及能够将 JavaScript 实现的子 classes 的对象传回 Objective-C APIs,后者使用父 class 作为接口定义。
我最大的问题是我并不完全了解Objective-C,而我知道这一点。这就是我为此使用 JXA 的部分原因(主要原因是我发现您甚至可以使用 JavaScript 来完成这一切,因为自动化非常有趣。)
我也不知道 Cocoa API,但我正在尝试通过 JXA 学习它。
那么,我将如何使用 JXA 创建和填充 JavaScript window?
我目前的代码是:
ObjC.import('Cocoa');
var frame = $.NSMakeRect(100, 100, 200, 200);
var styleMask = $.NSMiniaturizableWindowMask |
$.NSClosableWindowMask |
$.NSTitledWindowMask;
var rect = $.NSWindow.contentRectForFrameRect = frame;
rect.styleMask = styleMask;
var window = $.NSWindow.alloc.initWithContentRect = rect;
window.styleMask = styleMask;
window.setBackgroundColor = $.NSColor.blueColor;
除了 Apple 随 Objective-C 绑定的 JXA 文档提供的片段外,几乎没有其他示例。
那么有人可以告诉我如何使用 JXA 设计一个基本的 window,也许还有标签、文本框和按钮吗?
可以找到一个很好的教程here
ObjC.import("Cocoa");
var styleMask = $.NSTitledWindowMask | $.NSClosableWindowMask | $.NSMiniaturizableWindowMask;
var windowHeight = 85;
var windowWidth = 600;
var ctrlsHeight = 80;
var minWidth = 400;
var minHeight = 340;
var window = $.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer(
$.NSMakeRect(0, 0, windowWidth, windowHeight),
styleMask,
$.NSBackingStoreBuffered,
false
);
var textFieldLabel = $.NSTextField.alloc.initWithFrame($.NSMakeRect(25, (windowHeight - 40), 200, 24));
textFieldLabel.stringValue = "Image: (jpg, png, or gif)";
textFieldLabel.drawsBackground = false;
textFieldLabel.editable = false;
textFieldLabel.bezeled = false;
textFieldLabel.selectable = true;
var textField = $.NSTextField.alloc.initWithFrame($.NSMakeRect(25, (windowHeight - 60), 205, 24));
textField.editable = false;
var btn = $.NSButton.alloc.initWithFrame($.NSMakeRect(230, (windowHeight - 62), 150, 25));
btn.title = "Choose an Image...";
btn.bezelStyle = $.NSRoundedBezelStyle;
btn.buttonType = $.NSMomentaryLightButton;
window.contentView.addSubview(textFieldLabel);
window.contentView.addSubview(textField);
window.contentView.addSubview(btn);
window.center;
window.title = "Choose and Display Image";
window.makeKeyAndOrderFront(window);
我最近了解到存在 JavaScript 自动化。对我来说更有趣的是能够调用 Objective-C APIs, subclass Objective-C classes in JavaScript, 以及能够将 JavaScript 实现的子 classes 的对象传回 Objective-C APIs,后者使用父 class 作为接口定义。
我最大的问题是我并不完全了解Objective-C,而我知道这一点。这就是我为此使用 JXA 的部分原因(主要原因是我发现您甚至可以使用 JavaScript 来完成这一切,因为自动化非常有趣。)
我也不知道 Cocoa API,但我正在尝试通过 JXA 学习它。
那么,我将如何使用 JXA 创建和填充 JavaScript window?
我目前的代码是:
ObjC.import('Cocoa');
var frame = $.NSMakeRect(100, 100, 200, 200);
var styleMask = $.NSMiniaturizableWindowMask |
$.NSClosableWindowMask |
$.NSTitledWindowMask;
var rect = $.NSWindow.contentRectForFrameRect = frame;
rect.styleMask = styleMask;
var window = $.NSWindow.alloc.initWithContentRect = rect;
window.styleMask = styleMask;
window.setBackgroundColor = $.NSColor.blueColor;
除了 Apple 随 Objective-C 绑定的 JXA 文档提供的片段外,几乎没有其他示例。
那么有人可以告诉我如何使用 JXA 设计一个基本的 window,也许还有标签、文本框和按钮吗?
可以找到一个很好的教程here
ObjC.import("Cocoa");
var styleMask = $.NSTitledWindowMask | $.NSClosableWindowMask | $.NSMiniaturizableWindowMask;
var windowHeight = 85;
var windowWidth = 600;
var ctrlsHeight = 80;
var minWidth = 400;
var minHeight = 340;
var window = $.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer(
$.NSMakeRect(0, 0, windowWidth, windowHeight),
styleMask,
$.NSBackingStoreBuffered,
false
);
var textFieldLabel = $.NSTextField.alloc.initWithFrame($.NSMakeRect(25, (windowHeight - 40), 200, 24));
textFieldLabel.stringValue = "Image: (jpg, png, or gif)";
textFieldLabel.drawsBackground = false;
textFieldLabel.editable = false;
textFieldLabel.bezeled = false;
textFieldLabel.selectable = true;
var textField = $.NSTextField.alloc.initWithFrame($.NSMakeRect(25, (windowHeight - 60), 205, 24));
textField.editable = false;
var btn = $.NSButton.alloc.initWithFrame($.NSMakeRect(230, (windowHeight - 62), 150, 25));
btn.title = "Choose an Image...";
btn.bezelStyle = $.NSRoundedBezelStyle;
btn.buttonType = $.NSMomentaryLightButton;
window.contentView.addSubview(textFieldLabel);
window.contentView.addSubview(textField);
window.contentView.addSubview(btn);
window.center;
window.title = "Choose and Display Image";
window.makeKeyAndOrderFront(window);