Re:要求在Event-Dispatch Thread上创建Swing对象.
我正在开发一个应用程序,其目的是监视和显示各种远程嵌入式服务器的状况.我是Java的新手,我对Swing对象和EDT的要求的理解是不完整的.
主GUI在EDT上以通常的方式启动,如下所示,
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
Run Code Online (Sandbox Code Playgroud)
然后,用户可以选择与一个或另一个远程机器相对应的一个或多个菜单选项.这样做的效果是每次都创建一个新线程,如下所示
new Thread(new VoterStatus(itemNumber)).start();
Run Code Online (Sandbox Code Playgroud)
它调用VoterStatus的类"run"方法,该方法又创建一个带有JFrame的新窗口.新线程(VoterStatus类的一个实例)然后询问(TCP等)指定的特定远程(itemNumber),收集各种信息并在JFrame中显示它们.
可能有任意数量的此类线程对应于VoterStatus的实例,所有这些都更新了自己的窗口.这些不同的窗口/ JFrame /任务之间没有数据共享.
这似乎工作得很好,但是安全吗?
我是否违反了有关在EDT上创建Swing组件的规则?
使用SwingWorker类会有益吗?
我要感谢Java程序员在这些问题上更有经验的任何评论.
谢谢Steve
我对java中的方法调度感到困惑.为什么第一种方法"a.m1(b)"调用A类?
调用变量是一个.它的运行时类型是B,不是吗?
class A {
public void m1(A a){
System.out.println("A-m1");
}
public void m1(){
System.out.println("A-m1");
}
}
class B extends A {
public void m1( B b){
System.out.println("B-m1");
}
public void m1(){
System.out.println("B-m1");
}
}
public class HelloWorld {
public static void main(String[] args) {
B b = new B();
A a = new B();
a.m1(b);//prints A-m1
a.m1();//prints B-m1
}
}
Run Code Online (Sandbox Code Playgroud) 我在一个单独的类中有以下方法:
class API: NSObject {
var data = NSData()
var delegate: APIProtocol?
func getItems(callback: (Array<Image>) -> ()) {
let urlPath: NSString = "http://localhost:3000/files"
let url = NSURL(string: urlPath)
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Accept")
let config = NSURLSessionConfiguration.defaultSessionConfiguration() as NSURLSessionConfiguration
let session = NSURLSession(configuration: config) as NSURLSession
var dataTask = NSURLSessionDataTask()
dataTask = session.dataTaskWithRequest(request) { (data, response, error) in
if (error == nil) {
println("API at URL \(url)")
let responseArray = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: …Run Code Online (Sandbox Code Playgroud) 我读了一段代码,它每秒都会检查数据并更新UI.这听起来像我们通常使用的NSTimer scheduledtimerwithtimeinterval.但是这个代码是通过递归调用实现的dispatch_after:
- (void) retriggerMethod {
... do stuff here, assuming you want to do it on first invocation ...
dispatch_after( ..., ^{
[self retriggerMethod];
});
}
Run Code Online (Sandbox Code Playgroud)
dispatch_after递归和NSTimer scheduledtimerwithtimeinterval之间的区别是什么?使用前者时是否存在潜在风险?我想当你使用它时,只要不结束这种递归,调用栈就会增长.
我在 Internet Explorer 11 中调度事件时遇到问题。目前,我们有:
fireEvent
对于 IE 和
createEvent
initEvent
dispatchEvent
Run Code Online (Sandbox Code Playgroud)
普通浏览器的习惯用法。
问题是这些在 IE 11 中都不起作用。新方法 - 使用new Event()/也不起作用new CustomEvent()。
看起来微软弃用了他们的专有fireEvent(对于 IE 11),但没有提供对正确调度的支持。
附注。我相信我已经阅读了与此相关的所有主题,但仍然找不到工作解决方案
javascript events internet-explorer dispatch internet-explorer-11
我正在使用调度组来获取数据字符串。这是一个代码,我不确定为什么要输入Unbalanced call to dispatch_group_leave()此代码。
var queue = DispatchQueue(label: "extractStringQueue", attributes: .concurrent)
queue.async {
let m_group = DispatchGroup()
let weeks = self.weekDataArray
for week in weeks {
for day in week.dayDataArray {
m_group.enter()
day.processStringData(dataName, completionHandler: { (data, response, error) in
if true {
// Process
m_group.leave()
}
})
}
}
m_group.notify(queue: queue, execute: {
// CompletionHandler
})
}
Run Code Online (Sandbox Code Playgroud) 为了与 slack 交互,服务器需要能够基于某种加密散列验证请求。如果此检查返回 false,则服务器应以 400 响应。将其作为 mixin 执行此操作似乎是明智的:
class SlackValidationMixin:
def dispatch(self, request, *args, **kwargs):
if validate_slack_request(request):
return super().dispatch(request, *args, **kwargs)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)
这给出了错误“accepted_renderer not set on Response”基于一个SO问题,我添加了以下内容:
class SlackValidationMixin:
def dispatch(self, request, *args, **kwargs):
if validate_slack_request(request):
return super().dispatch(request, *args, **kwargs)
else:
response = Response(status=status.HTTP_400_BAD_REQUEST)
response.accepted_renderer = JSONRenderer
response.accepted_media_type = "application/json"
response.renderer_context = {}
return response
Run Code Online (Sandbox Code Playgroud)
但这给出了错误: AttributeError: 'NoneType' object has no attribute 'get_indent'
为什么它需要一个accepted_renderer,因为它只响应一个HTTP 状态代码,没有额外的数据?解决这个问题的最简单方法是什么?
以下建议使 EmptyResponse 对象从 Response 继承:
Traceback (most recent call last):
File "path/lib/python3.8/site-packages/django/core/handlers/exception.py", line …Run Code Online (Sandbox Code Playgroud) 我读过很多关于派遣工作的文章。但我对此仍然有点困惑。
例如,如果我有
class ViewController: UIViewController {
@IBAction func actionDoStuff(_ sender: UIButton) {
DispatchQueue.global(qos: .userInitiated).async {
Api.request { result in
//completes in main thread
//what if I need to dispatch again ?
DispatchQueue.global(qos: .userInitiated).async {
//Do other stuff here
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
和
class Api {
static func request(completion: @escaping (Result<String, NSError>) -> Void) {
DispatchQueue.global(qos: .userInitiated).async {
//url session configure
let url = URL(fileURLWithPath: "test.com")
URLSession.shared.dataTask(with: url) { data, response, error in
DispatchQueue.main.async {
completion(.success("Request are success")) //without …Run Code Online (Sandbox Code Playgroud) 我知道 Firebase getDocument 调用是异步的,所以我试图找出如何本质上等待调用完成执行,然后继续执行其他操作。
我尝试过使用 DispatchGroup() 并进入/离开组,但我似乎无法让它正常工作。我有类似以下内容:
let myGroup = DispatchGroup()
let usersRef = self.db.collection("Users").document("Users").collection("Users")
if self.testCondition == false {
self.errorMessage = "error"
} else{
usersRef.getDocuments {(snap, err) in
myGroup.enter()
//basically getting every username
for document in snap!.documents{
let user = document["username"] as! String
let userRef = usersRef.document(user)
userRef.getDocument { (snapshot, err) in
if err != nil {
print(err)
} else {
let sample = snapshot!["sample"] as! String
if sample == 'bad' {
self.errorMessage = "error"
}
}
}
} …Run Code Online (Sandbox Code Playgroud) 我试过了:
#[enum_dispatch(BarTrait, BazTrait)]
pub enum Foo {
VariantZero,
...
}
Run Code Online (Sandbox Code Playgroud)
它似乎忽略了第一个之后的任何特征,默默地。
这会导致错误,因为在这种情况下,编译器似乎不相信 Foo 实现了 BazTrait。
更新:@kmdreko 的代码只要与BazTrait位于同一个板条箱中就可以正常工作Foo。
当BazTrait位于另一个同样使用 的板条箱中时enum_dispatch,BazTrait将被忽略并导致以下形式的两个错误:
error[E0599]: no method named `baz` found for enum `Foo` in the current scope
--> src/main.rs:53:9
|
45 | enum Foo {
| -------- method `baz` not found for this
...
53 | foo.baz();
| ^^^ method not found in `Foo`
|
= help: items from traits can only be …Run Code Online (Sandbox Code Playgroud)