【问题标题】:Java, Swing and Xubuntu, JFrames not correctJava、Swing 和 Xubuntu、JFrames 不正确
【发布时间】:2011-06-12 00:17:52
【问题描述】:

我对 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。我对此进行了谷歌搜索,并发现了与 Compziz(?) 相关的类似内容,但据称不久前已修复。我现在有点卡住了。我有一个运行良好的 Swing 应用程序,它响应按钮 OK 但仍然不显示标题等。任何帮助将不胜感激。

【问题讨论】:

    标签: java swing ubuntu


    【解决方案1】:

    我不使用 Xubuntu,但一般规则是任何更新 GUI 的代码都应该在事件调度线程上执行。请参阅 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();
                }
            });
        }
    }
    

    【讨论】:

    • 谢谢,我马上试试。
    • 完美的解决方案,我猜它只能在 Windows 中运行。谢谢
    【解决方案2】:

    建议:在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多