应用程序对游戏手柄上发生的操作做出反应.当按下按钮时,UI上会发生某些事情.但我遇到了app挂起或"java.lang.IllegalStateException:Not on FX application thread"异常的问题.
为了解决这个问题,我尝试了以下方法:Platform.runLater()和Task使用方法.但它没有帮助.
这是问题代码:
public class GamepadUI extends Application{
private static final int WIDTH = 300;
private static final int HEIGHT = 213;
private Pane root = new Pane();
private ImageView iv1 = new ImageView();
private boolean isXPressed = false;
@Override
public void start(Stage stage) throws Exception {
initGUI(root);
Scene scene = new Scene(root, WIDTH, HEIGHT);
stage.setScene(scene);
stage.setResizable(false);
stage.show();
}
public void pressBtn() {
if(!isXPressed) {
iv1.setVisible(true);
isXPressed = true;
}
}
public …Run Code Online (Sandbox Code Playgroud) 我有一个包含列的表name,client_name和requester_name.我需要将这些列的值从"Mic"更新为"Michael".
以下是一些应该更新的记录:
name | client_name | requester_name
------+-------------+----------------
Mic | Jerry | Jack
Jack | Mic | Mic
Jerry | Jack | Mic
Run Code Online (Sandbox Code Playgroud)
我尝试了以下查询:
UPDATE names
SET name='Michael', client_name='Michael', requester_name='Michael'
WHERE name='Mic' OR client_name='Mic' OR requester_name='Mic';
Run Code Online (Sandbox Code Playgroud)
此查询使所有列都将所有名称更改为"Michael".
查询应该如何仅在适用的情况下应用更改?
我有多模块项目,对不同的模块版本有很多依赖.目前版本是硬编码的,需要手动更改它们.因此,我决定将所有这些文件放在属性文件中,并在项目构建期间从中获取属性值.
以下是我尝试这样做的方法:
root pom.xml
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>./version.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
文件版本.properties
module1.version=1.1
module2.version=1.8
module3.version=5.4
Run Code Online (Sandbox Code Playgroud)
模块pom.xml的示例
<properties>
<module1.project.version>${module1.version}</module1.project.version>
</properties>
<parent>
<groupId>com.mymodule</groupId>
<artifactId>test</artifactId>
<version>${module1.version}</version>
<relativePath>../pom.xml</relativePath>
</parent>
Run Code Online (Sandbox Code Playgroud)
构建失败:
无法在项目ccm-agent上执行目标org.codehaus.mojo:build-helper-maven-plugin:1.7:parse-version(parse-versions):目标org.codehaus.mojo的执行解析版本:build-helper- maven-plugin:1.7:parse-version失败.NullPointerException - > [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException:无法在项目ccm-agent上执行目标org.codehaus.mojo:build-helper-maven-plugin:1.7:parse-version(parse-versions) :目标org.codehaus.mojo的执行解析版本:build-helper-maven-plugin:1.7:解析版本失败.
如何从文件中读取某些属性并以正确的方式配置pom.xml?
这是绘制椭圆形的简单示例.
public class SwingPainter extends JFrame{
public SwingPainter() {
super("Swing Painter");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
getContentPane().add(new MySwingComponent());
setSize(200, 200);
setVisible(true);
}
public static void main(String[] args) {
new SwingPainter();
}
class MySwingComponent extends JComponent {
public void paintComponent(Graphics g) {
System.out.println("paintComponent");
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(10, 10, 50, 50);
}
@Override
protected void paintBorder(Graphics g) {
System.out.println("Paint border");
super.paintBorder(g);
}
@Override
protected void paintChildren(Graphics g) {
System.out.println("Paint children");
super.paintChildren(g);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是在调试模式或在绘制之前向控制台添加一些信息(如示例中),您可以看到swing绘制组件两次.
的paintComponent
油漆边框
画儿童
的paintComponent
油漆边框
画儿童
我无法理解它为什么会发生,但我认为它会影响困难的GUI中的性能.
当你setContentType("text/html")时,它仅适用于通过JTextPane.setText()设置的文本.通过样式放到JTextPane的所有其他文本对内容类型"免疫".
这就是我的意思:
private final String[] messages = {"first msg", "second msg <img src=\"file:src/test/2.png\"/> yeah", "<img src=\"file:src/test/2.png\"/> third msg"};
public TestGUI() throws BadLocationException {
JTextPane textPane = new JTextPane();
textPane.setEditable(false);
textPane.setContentType("text/html");
//Read all the messages
StringBuilder text = new StringBuilder();
for (String msg : messages) {
textext.append(msg).append("<br/>");
}
textPane.setText(text.toString());
//Add new message
StyledDocument styleDoc = textPane.getStyledDocument();
styleDoc.insertString(styleDoc.getLength(), messages[1], null);
JScrollPane scrollPane = new JScrollPane(textPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
//add scrollPane to the main window and launch
//...
}
Run Code Online (Sandbox Code Playgroud)
一般来说,我有一个由JTextPane表示的聊天.我从服务器接收消息,处理它们 - 为特定情况设置文本颜色,将微笑标记更改为图像路径等.所有内容都在HTML的范围内进行.但是从上面的例子中可以清楚地看到,只有setText是setContentType("text/html")的主题,第二部分,其中添加的新消息由"text/plain"表示(如果我没有弄错的话) ).
是否可以将"text/html"内容类型应用于插入到JTextPane的所有数据?没有它,如果不实现非常复杂的算法,几乎不可能处理消息.
我有一个字符串:[1, 2, 3, 4].我只需要整数1 2 3 4.
我尝试了以下拆分:
str.split(",");
str.split("\\D\\s");
Run Code Online (Sandbox Code Playgroud)
两个分裂返回四个元素:[1 2 3 4],但我不需要这些括号[ ].拆分正则表达式有什么问题?
更新
我不得不提到每个数字被包裹的情况都[ ]可能发生.
我对访问者模式有点不友好,但我有一个需要访问者实现的任务(如果我想避免"instanceof"检查).
我有一个类,它是几个gwt元素的包装:Label,Panel,Widget(可以是复选框,列表框,文本框等).我使用数组作为UI的相似部分的集合.例如Label +复选框,Label +文本框; 标签+按钮等
一些元素以不同的方式构造(从例如Panel派生的另一个类的一部分).因此,我有两个相同的构造函数,但在一个地方使用重载方法.我可以合并这些构造函数并使用上面提到的方法中的"instanceof"检查元素.但我不喜欢这个解决方案,并希望使用访问者模式替换它.说实话,我不知道该怎么做,希望对你有所帮助.
这是我的一个例子:
public class MyWidgets {
private String stringLabel;
private Widget widget;
private Panel panel;
public MyWidgets(String stringLabel, Widget widget) {
this.stringLabel = stringLabel;
this.widget = widget;
initPanel(stringLabel, widget);
}
public MyWidgets(ConstructedClass cs, Widget widget) {
this.widget = widget;
initPanel(cs, widget);
}
private initPanel(String label, Widget widget) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
private initPanel(ConstructedClass cs, Widget widget) {
panel = SomeStaticUtilityClass(cs, widget);
}
}
Run Code Online (Sandbox Code Playgroud)
像这样的东西(我试图让它最大化抽象,实际上它更难).
所以我有一个使用"instanceof"的解决方案:
private initPanel(Object object, Widget widget) {
if(object …Run Code Online (Sandbox Code Playgroud) 我有一个记录列表,每个记录都有一个打开设置窗口的按钮.此外,我有很多逻辑部分的首选项,每个部分都有一些带按钮的记录.
所以,当我点击一个按钮时,会出现一个对话框窗口,但是如果这个按钮位于页面底部的某个位置(让它成为带按钮的300条记录),我的对话框窗口会出现在顶部.因此,我必须向上滚动才能找到此窗口(有时它会出现在浏览器边框后面).
或者只是想象你配置一些东西并向下滚动页面填充每个选项,最后你保存你的配置,但是一些字段填写不正确,警告弹出窗口出现......在页面的某个地方,但不在你的指针附近,甚至不在你的指针附近当前页面的中间位置.
我的所有对话框窗口都是从DialogBox继承而来的,所以我使用的是super.show()和super.center(),但它并不像我想要的那样工作.
小信息添加:一些对话框窗口从服务器接收数据,当收到所有数据时,将显示窗口的其余部分.我怀疑这可能会导致窗口出现在错误的地方.
我想在其父窗口的中心上方打开一个对话框窗口,因此我使用以下公式:
Window window = ((Node) actionEvent.getSource()).getScene().getWindow();
Scene scene = new Scene(new Group(new DialogWindow()));
Stage dialog = new Stage();
dialog.initOwner(window);
dialog.sizeToScene();
dialog.setX(stage.getX() + stage.getWidth() / 2 - dialog.getWidth() / 2); //dialog.getWidth() = NaN
dialog.setY(stage.getY() + stage.getHeight() / 2 - dialog.getHeight() / 2); //dialog.getHeight() = NaN
dialog.setScene(scene);
dialog.show(); //it is better to showAndWait();
Run Code Online (Sandbox Code Playgroud)
我没有手动设置大小,因为我需要自动调整窗口大小以适应其内容的大小.
在Linux下,它在父窗口的中心直接设置窗口.但是在Windows中它不起作用并导致不同的结果.
如果我不手动设置对话框的宽度和高度,怎么能得到它?
使用ant构建下一个项目版本的例程太多了.例程在几个属性文件中,必须在运行ant任务之前进行编辑.我看了一下Jenkins作为一个系统来进行构建(包括夜间构建),但我有一个改变属性的问题.
是否有可能(如果是,我该怎么做)在构建之前在Jenkins配置中键入参数,以便将它们传递给ant?
我真正的意思是以下架构(我在手动构建中使用):
有2个属性文件包含有关构建版本,src目标,用于通知新构建的电子邮件等的数据.
在Ant任务中使用相应的属性键,并在构建之前手动更改这些属性.
Java util读取了一些属性,并在构建期间用于它们自己的部分.
在build.xml中还导入了3或4个ant XML,这些xmls还从提到的文件中读取属性.
我想做的是:
更改Jenkins中的关键属性
按建设项目
我的数据将覆盖属性文件中的数据,或者作为ant vars值直接传递给ant的任务.
结果我收到了相应通知的新版本(它们是通过ant制作的)
是否存在允许通过Jenkins使这种模式工作的机制?
先感谢您.