我是Linux新手,并且一直试图让我的(Windows内置的)Java Swing项目在与我构建的可执行jar文件不同的机器上的XUbuntu上正常工作。
我已将问题减少到最少量的代码
import java.awt.Dimension;
import javax.swing.*;
public class JFrameTest extends JFrame {
public JFrameTest(String title) {
super(title);
JLabel lab = new JLabel("Label");
this.getContentPane().add(lab);
this.setMinimumSize(new Dimension(200, 200));
this.pack();
this.setVisible(true);
}
public static void main(String args[]) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JFrameTest frame = new JFrameTest("Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
在Windows上我看到:
在Xubuntu中,我只看到一个灰色框和标签,而不是标题或关闭图标等。我还必须在从命令行进行ctrl zedded后杀死(-9)jvm。我用java -jar filename.jar
启动它我的Linux机器正在运行Xubuntu 11.我已经安装了sun Java 6_24 JRE。我用Google搜索并发现了类似于Compziz(?)的内容,但据说这种情况有一段时间后得到修复。我现在有点卡住了。我有一个Swing应用程序可以正常工作,因为它响应按钮确定但仍然没有显示标题等。任何帮助将非常感激。
答案 0 :(得分:5)
我不使用Xubuntu,但一般规则是任何更新GUI的代码都应该在Event Dispatch Thread上执行。请参阅Concurrency上的Swing教程中的部分。
Swing教程中的示例都使用如下格式:
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
add( new JLabel("Label") );
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new SSCCE() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
答案 1 :(得分:4)
建议:在EDT上启动GUI。可见。
import java.awt.Dimension;
import javax.swing.*;
public class JFrameTest extends JFrame {
public JFrameTest(String title) {
super(title);
JLabel lab = new JLabel("Label");
this.getContentPane().add(lab);
this.setMinimumSize(new Dimension(200, 200));
this.pack();
this.setVisible(true);
}
public static void main(String args[]) {
// Costruct & show the GUI on the EDT
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JFrameTest frame = new JFrameTest("Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
}
有关详细信息,请参阅Concurrency in Swing。