我对Linux完全陌生,并且一直在尝试使我的(建立Windows的)Java Swing项目在XUbuntu上与我构建的可执行jar文件不同的机器上正常工作。

我已将问题减少到最少的代码

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中,我仅看到一个灰色框和标签,而不是Title(标题)或关闭图标等。在从命令行按ctrl键之后,我还必须杀死(-9)jvm。我用java -jar filename.jar启动了它

我的Linux机器正在运行Xubuntu11。我已经安装了sun Java 6_24 JRE。我对此进行了谷歌搜索,发现与Compziz(?)类似的东西,但是据称这是在不久前修复的。我现在有点卡住了。我有一个可以正常运行的Swing应用程序,它可以对按钮进行响应,但仍然不显示标题等。我们将不胜感激。

最佳答案

我不使用Xubuntu,但是一般规则是,任何更新GUI的代码都应在事件调度线程上执行。请参见Swing教程中关于Concurrency的部分。

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();
            }
        });
    }
}

08-05 15:26