是否可以以标准方式执行此操作?
这是场景.
开始在EDT中做一些昂贵的事情(EDT被阻止,直到昂贵的操作结束).
当EDT被阻止时,用户继续单击/拖动鼠标按钮.所有鼠标操作都记录在某处.
当EDT是免费的(用昂贵的东西完成)时,它开始处理鼠标事件.
我在步骤3中想要的是丢弃堆积的鼠标事件.在EDT免费之后,任何新的鼠标事件都应该以通常的方式处理.
关于如何实现这一点的任何想法.
PS:我不可能阻止EDT被阻止(我不控制程序中某些模块的行为).
编辑:如果我可以安全地调用"SunToolkit.flushPendingEvents()",那么在开始EDT中的昂贵操作之前,我总是可以放一个玻璃板.在昂贵的操作结束后,在EDT线程上,冲洗所有事件 - 他们将进入一个不做任何事情的玻璃窗格.然后让EDT正常工作.
EDIT2:我添加了一个SSCCE来演示这个问题.
public class BusyCursorTest2 extends javax.swing.JFrame {
public BusyCursorTest2() {
javax.swing.JButton wait = new javax.swing.JButton("Wait 3 seconds");
getContentPane().setLayout(new java.awt.GridLayout(2, 1, 0, 0));
getContentPane().add(wait);
getContentPane().add(new javax.swing.JToggleButton("Click me"));
setTitle("Busy Cursor");
setSize(300, 200);
setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
wait.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent event) {
final java.util.Timer timer = switchToBusyCursor(BusyCursorTest2.this);
try {
//do something expensive in EDT
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
//do nothing
}
} finally {
switchToNormalCursor(BusyCursorTest2.this, timer);
} … 我创建了应用程序,它的表现非常符合预期.只要数据库查询正在运行,gui就会保持响应.使用SwingUtilities.invokeLater()创建自定义面板时,gui会冻结很短的时间.
当我使用SwingUtilities.invokeAndWait()时,它在高端游戏PC上运行非常流畅.(可能不是代码最好的机器...)但是在相对较慢的机器(双核,2GB RAM)上,gui"滞后"
我创建了一个非常小的程序版本来重现行为.测试时增加TEST_NUMBER_OF_PANELS的值.
它将它设置为一个非常大的值,以重现我当前的电脑上的行为,没有任何花哨的外观和感觉和其他组件.但我不想这样张贴.所以我减少到100
package test;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.event.TableModelEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
//import org.pushingpixels.substance.api.SubstanceLookAndFeel;
//import org.pushingpixels.substance.api.skin.BusinessBlackSteelSkin;
//import org.pushingpixels.substance.api.skin.SubstanceBusinessBlackSteelLookAndFeel;
public class Test extends JFrame {
private static final int TEST_NUMBER_OF_PANELS = 100; …Run Code Online (Sandbox Code Playgroud) 我是 Go 和 Gin 的新手,所以请原谅我的无知。
我已经使用 Gin 设置了一个支持 POST 请求的服务器。我希望用户发布他们的请求,其中包括将请求重定向到另一个 URL 所需的 JSON 负载。作为重定向的一部分,我需要传递原始 JSON 有效负载。例如,如果用户发出此 CURL 请求:
curl -H "Content-Type: application/json" -d '{ "name": "NewTest Network", "organizationId": 534238, "type": "wireless"}' -X POST " http://localhost: 8080/网络》
我的 Gin 代码是这样做的:
r.POST("/network", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, networks_url)
})
Run Code Online (Sandbox Code Playgroud)
其中:networks_url 是重定向的 URL。我需要一种将原始 JSON 有效负载传递到重定向 URL 的方法。
您能提供的任何帮助将不胜感激。
在我的Windows机器上,我安装了Visual Studio代码.要手动运行测试,我将进入项目文件夹并输入
go test main_test.go
Run Code Online (Sandbox Code Playgroud)
它完美地运作.
但我有一种情况需要调试我的测试以了解正在发生的事情.
为此,我打开launch.json并添加配置
{
"name": "Tests",
"type": "go",
"request": "launch",
"mode": "test",
"remotePath": "",
"port": 2346,
"host": "127.0.0.1",
"program": "${workspaceRoot}",
"env": {},
"args": [
"main_test.go"
],
"showLog": true
}
Run Code Online (Sandbox Code Playgroud)
按完F5后,我有
2017/03/29 13:28:11 server.go:73: Using API v1
2017/03/29 13:28:11 debugger.go:68: launching process with args: [./debug.test main_test.go main_go]
not an executable file
Process exiting with code: 1
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会出现这个错误以及它正在寻找什么可执行文件?
我只是想知道是否仍然需要确保invokeLater()Runnable的同步性.
我遇到了死锁,需要在保持并发性的同时克服它.
这是一个好代码的例子吗?:
private String text;
private void updateText()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
synchronized(FrameImpl.this)
{
someLabel.setText(text);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
对于相当糟糕的示例感到抱歉,但我们必须假设它text被不同的线程修改,无法注入,并且依赖于正确的值.
这是正确的解决方案,还是通过将同步代码发送到未知的上下文中而无意中造成死锁问题?
谢谢.
我有一个全局变量,我试图在两个不同的函数中使用,并且无法弄清楚为什么以下代码不起作用...
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net"
"net/http"
)
type Message struct {
Body string
}
var api rest.Api
func hostLookup(w rest.ResponseWriter, req *rest.Request) {
ip, err := net.LookupIP(req.PathParam("host"))
if err != nil {
rest.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteJson(&ip)
}
func foo() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
router, err := rest.MakeRouter(
&rest.Route{"GET", "/lookup/#host", hostLookup},
)
if err != nil {
log.Fatal(err)
}
api.SetApp(router)
}
func bar() {
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
}
func main() {
foo()
bar()
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用...... HTTP服务器不会将请求路由到hostLookup函数. …
我注意到使用 Gin 返回这样的响应:
c.JSON(http.StatusOK, jsonData)
Run Code Online (Sandbox Code Playgroud)
自动创建以下标头:
application/json; charset=utf-8
Run Code Online (Sandbox Code Playgroud)
是否可以以某种方式修改标头以返回
application/json
Run Code Online (Sandbox Code Playgroud)
我宁愿采用这种方法而不是在;
有没有一种简单的方法可以使用 Gin Gonic 列出/迭代所有帖子值?(去)
我努力了:
c.Request.ParseForm()
for key, value := range c.Request.PostForm {
log.Printf("POST %v = %v",key,value)
}
Run Code Online (Sandbox Code Playgroud)
但这没有显示任何值,但是当我直接从上下文测试值时:
log.Printf("POST email = %v", c.PostForm("email")
Run Code Online (Sandbox Code Playgroud)
它输出很好。
我想做的是将所有发布值映射到 gin.H{} 上下文中,以便在失败时我可以将发布的值传递回 .HTML 模板上下文并预先填充它们(以及我的错误消息) 。我发现的最好方法是将每个 POST 值手动连接到 gin.H{} 映射,但对于大型表单来说,这些似乎很冗长且不理想。
我可以像这样初始化一个缓冲字符串通道
queue := make(chan string, 10)
Run Code Online (Sandbox Code Playgroud)
但是如何在 Go 的结构体中初始化缓冲通道呢?基本上我想将内存分配给缓冲字符串通道。但最初在结构中我只是定义它,在结构初始化中,我想为其分配内存
type message struct {
queue *chan string
// or will it be
//queue []chan string
}
func (this *message) init() {
queue = make(chan string,10)
this.queue = &queue
}
Run Code Online (Sandbox Code Playgroud) 我想完全分离客户端和服务器,所以我创建了一个带有vue init webpack my-project. 在这个项目中,我将 vue-router 用于我的所有路由(这包括特殊路径,例如/user/SOMEID..
这是我的 routes.js 文件:
import App from './App.vue'
export const routes = [
{
path: '/',
component: App.components.home
},
{
path: '/user/:id',
component: App.components.userid
},
{
path: '*',
component: App.components.notFound
}
]
Run Code Online (Sandbox Code Playgroud)
当我使用npm run dev一切完美运行应用程序时。我现在准备部署到云中,所以我运行了npm run build. 由于我需要使用 HTTP 服务器,因此我决定也使用 Go 来实现……这是我的 Go 文件:
package main
import (
"fmt"
"github.com/go-chi/chi"
"github.com/me/myproject/server/handler"
"net/http"
"strings"
)
func main() {
r := chi.NewRouter()
distDir := "/home/me/code/go/src/github.com/me/myproject/client/dist/static"
FileServer(r, "/static", http.Dir(distDir)) …Run Code Online (Sandbox Code Playgroud) go ×7
go-gin ×3
java ×3
swing ×3
invokelater ×2
channel ×1
concurrency ×1
eventqueue ×1
go-chi ×1
rest ×1
swingworker ×1
unit-testing ×1
vue-router ×1
vue.js ×1
vuejs2 ×1