Java, Swing и Xubuntu, JFrames не верны - PullRequest
2 голосов
/ 11 июня 2011

Я совершенно новичок в 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 я вижу:

Windows o/p

В Xubuntu я вижу только серое поле и метку, а незначки заголовка или закрытия и т. д. Мне также нужно убить (-9) jvm после того, как я убрал ctrl из командной строки.Я запустил его с помощью java -jar filename.jar

На моей машине с Linux работает Xubuntu 11. Я установил Sun Java 6_24 JRE.Я гуглил по этому поводу и нашел нечто похожее на Compziz (?), Но это якобы было исправлено некоторое время назад.Я немного застрял сейчас.У меня есть одно приложение Swing, которое работает нормально в том смысле, что оно реагирует на кнопки OK, но по-прежнему не показывает заголовок и т. Д. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

5 голосов
/ 11 июня 2011

Я не использую Xubuntu, но общее правило состоит в том, что любой код, который обновляет графический интерфейс, должен выполняться в потоке диспетчеризации событий.См. Раздел из учебника 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();
            }
        });
    }
}
4 голосов
/ 11 июня 2011

Предложение: Запустите GUI на EDT.Vis.

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

Для получения дополнительной информации см. Параллельность в Swing .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...