LINUX.ORG.RU

java, ненависть, дефолтный внешний вид (gtk)

 , ,


0

2

решил я в свою игру писаную на libGDX добавить диалог. Ну реализовал интерфейс(если правильно понял как это называется, неважно сейчас), под андроид запилил нативный. И стал вопрос десктопа. Погуглил, прочитал про Swing. Подумал что это то что нужно, мне же простой диалог(вы уверены что хотите выйти с игры) нужно было сделать. Написал такой код

try {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
}
catch (Exception e) {
    //Exception handle
}

//

Object[] options = {"Yes, please",
        "No, thanks",
        "No eggs, no ham!"};

int n = JOptionPane.showOptionDialog(f,
        "Would you like some green eggs to go "
                + "with that ham?",
        "A Silly Question",
        JOptionPane.YES_NO_CANCEL_OPTION,
        JOptionPane.QUESTION_MESSAGE,
        null,
        options,
        options[2]);

Компилирую это и получаю

Error parsing gtk-icon-sizes string: ''
Иду в гугл, узнаю в чем проблема, дальше редактирую свою тему(Numix, одна из стандартных тем в xubuntu) выполняя следующее:
in <YOUR THEME>/gtk-2.0/gtkrc:
gtk-icon-sizes =
"panel-menu=24,24:panel=20,20:gtk-button=18,18:gtk-large-toolbar=24,24"

Заработало, выглядит почти красиво. Но теперь собственно вопрос. А ЭТО ВООБЩЕ НОРМАЛЬНО? Такое поведение на одной из стандартных тем в xubutnu. Этот тупой Swing валится из-за того что не нашел какую-то строку? А вариант реализовать некое дефолтное знание в таком случае не судьба? В общем это долбаная джава меня достала. Сначала тупая idea почему-то решила загрузить i7 на ~50% на несколько минут, то прозрачные окна, то просто отвратительная графика(А ведь я не дизайнер, я пользуюсь простенькой xfce и не хочу каких-то красивых эффектов). Но поскольку ничего лучшего нет((Хочу плакать и умирать) то задам вопрос.

А что мне собственно делать в этой конкретной ситуации? Может убрать к чертям этот диалог из игры на десктопе(Я про эту игру)(все равно многие закрывают просто кликнув по крестику, а не через Esc). Или может убрать вот эту строчку

UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");

И использовать джавашный(крайне убогий) стиль? Или swing это просто неудачный выбор и есть что-то годное?

★★★

Ответ на: комментарий от anonymous

Юзаешь яву - должен страдать. Все просто.

Так и страдаю, и выхода из глобальной ситуации не вижу. Но что делать сейчас?

abs ★★★
() автор топика
Ответ на: комментарий от abs

Ну тогда SWT, страданий чуть меньше будет.

anonymous
()

javafx юзай, там норм гуй. Swing - это реализация чьих-то больных фантазий.

slyjoeh ★★★
()

JavaFX. Тока сегодня ковырял - вполне годная штука.

menangen ★★★★★
()

Так кто виноват в этом баге? gtk, твой дистрибутив, который кривой конфиг поставил или Java?

Legioner ★★★★★
()

По теме — вообще Swing не очень хороший проект и давно не развивается вроде. Он не обеспечивает хорошего «нативного» взаимодействия, выглядит чужеродным. Хорошо подходит, если нет претензий к внешнему виду (на самом деле для многих инструментов внешний вид стоит очень далеко в конце), но если хочется нативный вид — пиши на нативном API. В твоём случае это GTK. Как ты Java будешь увязывать с GTK, не знаю, может быть есть живые биндинги. Может быть лучше для GUI выбрать другой язык, а на Java написать другую часть программы, не имеющую отношения к GUI.

Legioner ★★★★★
()

А ЭТО ВООБЩЕ НОРМАЛЬНО?

Java

GTK

GNU/Linux

Не переживай, всё нормально. Оставь так, линуксоиды сами разберутся. Домохозяек тут нет.

EXL ★★★★★
()

Вся твоя ненависть из за нехватики знаний и немного изменнёного восприятия. Со свингов вцелом всё классно и нормально.
А вот с тобой... Вот скажи, зачем тебе использовать java2d в OpenGL приложении? (таже тебе советовали SWT, но сним проблема останется прежней, а мой вопрос актуальнее)

ii8_ ★★★★
()
Последнее исправление: ii8_ (всего исправлений: 2)
Ответ на: комментарий от ii8_

Есть особая каста упоряшек которые верят в Ъ-шность SWT, то что их эклипсина вся покрыта багами из-за версий gtk они не замечают.

Deleted
()
Ответ на: комментарий от ii8_

Вот скажи, зачем тебе использовать java2d в OpenGL приложении?

Оно уже давно 2d/3d, и в некоторых ситациях уделывает кокс

ioway
()
Ответ на: комментарий от ii8_

Вот скажи, зачем тебе использовать java2d в OpenGL приложении?

Я же написал вроде, диалог «вы точно хотите выйти?».

abs ★★★
() автор топика
Ответ на: комментарий от ioway

Я немного не про это. То что оно сто лет умеет 2d/3d это одно. А умеет оно это с помощью openGL? т.е. рендерить всё на видио карте, а не за счёт процессора? Да тоже умеет, только оч криво и только если принудительно включить через параметры jvm. Парень пишет игру и всё что у него отрисовывается - рисуется с помощью видюхи, используя libgdx, который в свою очередь как бекэнд пользует LWJGL.
Получется так, что парень катается на лодке, гребя всёлами, но при этом везёт зачемто с собой лошадь)))

ii8_ ★★★★
()
Ответ на: комментарий от abs

Скажу прямо - юзай нативные libgdx инстументы для UI. Либо пиши свои, эт не сложно, если простые. Не нужно в игре использовать java2d.

ii8_ ★★★★
()
Ответ на: комментарий от ii8_

Скажу прямо - юзай нативные libgdx инстументы для UI.

Есть с этим проблема. Но сейчас на пары нужно идти, вечерком отпишу.

abs ★★★
() автор топика
Ответ на: комментарий от abs

там всё просто. можно по примерам юнит тестов самого libgdx посмотреть и сделать. НО, уж какое это говнище в плане API! упоротый кто-то придумал(

ii8_ ★★★★
()
Ответ на: комментарий от ii8_

Он под андроид писал. Вот видать и решил при портировании малой кровью отделаться. Непонятно правда, зачем в игре нативные диалоги.

ioway
()
Ответ на: комментарий от Deleted

4.2. И факт заключается в том, что в описанной ситуации SWT просто работает, а swing просто не работает.

asaw ★★★★★
()
Ответ на: комментарий от asaw

Пока что уважыемый all (кроме тебя, птичка) видит что топиксратер сломал (сам, замечу) swing, а SWT пока не юзал. Ну а от тебя тотже all видит взорванную лужу.

Deleted
()
Ответ на: комментарий от Deleted

Тебе корона не давит за весь лор говорить?

asaw ★★★★★
()
Ответ на: комментарий от ii8_

Смотри в чем проблема. У меня вот такой код для показа нативного андроидовского диалога


public class AndroidLauncher extends AndroidApplication implements MyGame.RequestHandler {
    InterstitialAd interstitial;
    AdRequest.Builder adRequestBuilder;
    View gameView;




	@Override
	protected void onCreate (Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);

        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        gameView = initializeForView(new MyGame(this), config);




        layout.addView(gameView);
        setContentView(layout);

	}


    @Override
    public void confirm(final MyGame.ConfirmInterface confirmInterface) {
        gameView.post(new Runnable() {
            public void run() {
                new AlertDialog.Builder(AndroidLauncher.this)
                        .setTitle("Confirm")
                        .setMessage("Are you sure?")
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                confirmInterface.yes();
                                dialog.cancel();
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        })
                        .create().show();
            }
        });
    }
///...

А в desktop версии там стоят просто заглушки

public class DesktopLauncher implements  MyGame.RequestHandler{
    private static DesktopLauncher application;
	public static void main (String[] arg) {
        if (application == null) {
            application = new DesktopLauncher();
        }
		LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        config.height = 800;
        config.width = 480;
        config.addIcon("../res/drawable-hdpi/ic_launcher.png", Files.FileType.Internal);
		new LwjglApplication(new MyGame(application), config);
	}


    @Override
    public void confirm(final MyGame.ConfirmInterface confirmInterface) {
        // JAVA IS FULLSHIT BITCH!!!!!!! Its not correct work;((
    }

    @Override
    public void loadAds(){
        // for desktop no advertising
    }

    @Override
    public void showAds(){
        // for desktop no advertising
    }
}

И получается что на месте этих заглушек я не могу разместить libGDX-шний код, а нужно использовать нативный для десктопа код.

abs ★★★
() автор топика
Ответ на: комментарий от abs

1. Что за MyGame.RequestHandler? зачем он тебе в десктоп ланчере? 2. вынеси реализации MyGame.RequestHandler, если он действительно нужен, в отельные классы для ведра и компа. 3. Лучше перед выходом из приложения дёргать твои, непосредственно относящиеся к приложения, интерфейсы и именно в них отрабатывать всю логику. И после подтверждения выключать прилагу нативным методом. Из кода видно что утебя как-то так и иделается, только сранным способом)

ii8_ ★★★★
()
Ответ на: комментарий от ii8_

MyGame.RequestHandler

MyGame это собственно сердце игры где и написан весь код. Из него я вызываю это

public void confirm(final MyGame.ConfirmInterface confirmInterface) {
        // JAVA IS FULLSHIT BITCH!!!!!!! Its not correct work;((
    }

    @Override
    public void loadAds(){
        // for desktop no advertising
    }

    @Override
    public void showAds(){
        // for desktop no advertising
    }

А вот реализация этих трех вещей уже уникальна для каждой платформы, и пишется в разных лаунчерах.

В MyGame это выглядит так

public interface RequestHandler {
        public void confirm(ConfirmInterface confirmInterface);
        public void loadAds();
        public void showAds();
    }

    public interface ConfirmInterface {
        public void yes();
        public void no();
    }

    RequestHandler requestHandler;

    public MyGame(RequestHandler requestHandler)
    {
        this.requestHandler = requestHandler;
    }

abs ★★★
() автор топика
Ответ на: комментарий от abs

а ну тогда норм. Просто замени new AlertDialog.Builder(AndroidLauncher.this) на реализацию пользующую ui часть libgdx

ii8_ ★★★★
()
Ответ на: комментарий от asaw

4.2. И факт заключается в том, что в описанной ситуации SWT просто работает, а swing просто не работает.

эклипс в стандартной поставке вообще не стартует, это называется работает? https://bugs.eclipse.org/bugs/show_bug.cgi?id=430736

maloi ★★★★★
()
Ответ на: комментарий от maloi

Адепт скажет что это не проблема эклипса («RESOLVED WONTFIX»)

Deleted
()
Ответ на: комментарий от I-Love-Microsoft

писать гуй на Qt 5

Потихоньку присматриваюсь, но пока ещё не готов перейти при написании на android на плюсы

abs ★★★
() автор топика

жавообезьянки созданы чтобы страдать

anonymous
()

Сделай не нативный диалог, а в стиле интерфейса игры и не мучайся.

anonymous
()
Ответ на: комментарий от Deleted

Не проецируй свои комплексы на посторонних - не пались как в зомбоящике сейчас принято. Хоть за взрослого тебя принимать будут.

asaw ★★★★★
()
Ответ на: комментарий от asaw

я работу gtk3 отлично наблюдаю прямо сейчас, как и неработу libswt-pi3-gtk-*. По ссылке пишут о том же, а ты видимо не читал то что там написано.

maloi ★★★★★
()
Ответ на: комментарий от maloi

Видимо как раз я то и читал, в отличие от тебя:

$ ldd ./326/0/.cp/libswt-pi3-gtk-4421.so
./326/0/.cp/libswt-pi3-gtk-4421.so: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./326/0/.cp/libswt-pi3-gtk-4421.so)

The minimum version we require is glibc 2.14.
From the prior crash log we can see that glibc 2.13 is installed.

asaw ★★★★★
()
Последнее исправление: asaw (всего исправлений: 1)
Ответ на: комментарий от asaw

ты хоть свои-то сообщения читаешь? libswt не работает, а libgtk-3 - работает, причем даже сделать проверку на версию libc отказались, закрыли с WONTFIX.

maloi ★★★★★
()
Ответ на: комментарий от asaw

и кстати рекомендую начать различать WONTFIX - баг есть, но затрагивает мало пользователей/есть workaround/дорого чинить
от, например, NOTABUG, когда разработчки считают что бага не в их компоненте или это не бага а фича.

maloi ★★★★★
()
Ответ на: комментарий от asaw

Всё работает как положено, включая эклипс.

не работает, и разработчики эклипса это подтверждают, но тебе конечно лучше знать.

maloi ★★★★★
()
Ответ на: комментарий от maloi

Они тебе русским языком пишут: «The minimum version we require is glibc 2.14». Выполняй это требование и нет проблем. Либо не используй GTK3.

asaw ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.