Java,Swing和Xubuntu,JFrames不正确

时间:2011-06-11 16:02:20

标签: java swing ubuntu

我是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上我看到:

Windows o/p

在Xubuntu中,我只看到一个灰色框和标签,而不是标题或关闭图标等。我还必须在从命令行进行ctrl zedded后杀死(-9)jvm。我用java -jar filename.jar

启动它

我的Linux机器正在运行Xubuntu 11.我已经安装了sun Java 6_24 JRE。我用Google搜索并发现了类似于Compziz(?)的内容,但据说这种情况有一段时间后得到修复。我现在有点卡住了。我有一个Swing应用程序可以正常工作,因为它响应按钮确定但仍然没有显示标题等。任何帮助将非常感激。

2 个答案:

答案 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