1. Java / Говнокод #26816

    0

    1. 1
    про свинг

    песня про это дело

    Запостил: MAKAKA, 24 Июля 2020

    Комментарии (32) RSS

    • Приходите к нам в Swing!
      У нас есть:
      paint
      repaint
      paintImmediately
      paintComponent
      invalidate
      update
      addDirtyRegion
      RepainManager
      markCompletelyDirty
      Ответить
    • О чём этот тред?
      Ответить
    • Чото не форсица свинг. Неужели питухи никогда не писали десктоп говна на жабе?
      Ответить
    • И так, форс свинга.
      Один коммент -- один факт про свинг.
      Ответить
    • Сначала был AWT: каждый компонент имел т.н. "peer": нативного
      друга, использующего API OS для рисования настоящего окна.

      Это паттерн bridge, когда иерархия компонентов имела параллельную
      иерархию пиров -- нативных компонентов на C++, использующих
      API OS.

      Каждый нативный компонент был окном с точки зрения ОС. В винде
      они были видны через Spy++, на X11 через xwininfo итд.

      В какой-то момент оказалось, что компонентов мало (наибольший
      общий делитель всех окружений), и выглядят они везде по разному.
      Ответить
      • Кстати, такую же питушню я наблюдал в .NET:

        WinForms используют настоящие окна, потому каждая ``System.Windows.Froms.Button`` видна в Spy++, а в WPF нет, потому ``System.Windows.Controls.Button`` не видна.

        Всем насрать на десктопный гуй (если это не QT) в 2020, да?
        Ответить
    • Тогда SUN решил нарисовать свои компоненты. Так появился swing:
      он написан поверх AWT, и с точки зрения OS не виден.

      Каждый swing компонент имеет префикс J: Button это AWT (с пиром)
      а JButton -- чисто свинговый компонент.

      Свинговые стали называть lightweight, а AWTшные -- heavyweight.

      У свингового приложения есть один нативный (heavyweight) компонент
      с окном ОС, а в нем рисуются lightweight (невидимые ОС) компоненты.
      Ответить
    • Далее, решили вынести из lightweight компонентов их представление.
      Сначала хотели использовать MVC, но затем поняли, что Controller
      (слушающий поведение пользователя) и VIEW связаны между собой,
      и сделали так:
      Компонент Swing представляет API программисту, а рисование и получение
      событий от пользователя делегирует "UI": UI назвали Pluggable Look and Feel.

      L and F устанавливаются с помощью setUI, и рисуют компоненты.
      Есть LF Metal, есть Motif, есть а-ля-windows. Все они по сути библиотеки
      рисования компонентов, и разумеется не видимы с точки зрения OS.
      Ответить
    • Рутовый heavyweight компонент получает события от ОС, и передает
      его своим дочерним компонентам. По умолчанию события замаскированы,
      но если добавить слушателя -- они расмаскируются.
      Ответить
    • Как и большинство UI Swing/AWT однопоточен: рисовать и обрабатывать
      событя можно только на UI треде.

      Тред отвечает на запросы ОС о перерисовке, так что тяжелые операции
      надо выносить в другой тред (к счастью, джава умеет нативные потоки).
      Ответить
    • В Swing так же завезли двойную буферизацию: компоненты рисуют себя
      в памяти, а затем RepaintManager копирует их на экран.
      Ответить
    • Далее стал вопрос "а как расположить компоненты?".
      Можно конечно физически задать размер и расположение, но это не удобно.

      Тогда сделали так: каждый компонент имеет методы, чтобы сообщить
      желаемые размеры, а в контейнер добавляется LayoutManager, котррый
      на основе этих данных и распологает каждый компонент.

      LayoutManagerов очень много разных: можно распологать последовательно,
      табличкой, кусочками итд.
      Ответить
    • Писали когда-нить гуй на джабе?
      Помните, что такое "апплеты"?
      Ответить
    • https://www.youtube.com/watch?v=lvOZu3XSslc
      Ответить
    • Сам ты свинг. Хрюкни.
      Ответить
      • А ты используешь UI на lua? wxLua?
        Ответить
        • wx не юзал, но пытался. То есть я скачал библу и забыл что я скачал библу.
          А так я пользоваться fltk4
          Ответить
        • «wxLua» — это междумордие к «wxWidgets» — свободной пародии на «MFC»?
          Ответить
          • чего этоты так неуважительно?

            wxы очень крутые: они имеют крестовый и API и привязку для каждой скриптушни, и при этом они используют нативные окна окружения, потому везде выглядят как родное приложение.

            Причем на маке у них были бекенды для карбона (переходного API, в котором приложения выглядят как классика), а на юниксе они умеют gtk, tq, motif и прямо голые иксы.

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

            Но для маленьких утилиток это охуенно имхо.
            Ответить
            • Вообще мне понравилось. Есть даже реальные примеры порта виндового софта на другие платформы с помощью «wxWidgets».

              Например, был «eMule» — клиент p2p-сетей «ed2k» и «Kad». Существовал он только под «Windows», потому что его морда использовала «MFC».

              Потом добровольцы его переписали с «MFC» на «wxWidgets», и так появился «AMule» на других платформах. Там многие интерфейсы похожи (нужно в именах классов заменить «C» на «wx»), но иногда бывают неприятности вроде другого количества аргументов у методов или не совсем совпадающих типов, когда приходится патчить вручную.

              «wxWidgets» ещё кучу компиляторов поддерживают...

              Похуже дела обстоят с портами «ATL». Хотя я давно смотрел, может быть, сейчас получше.
              Ответить

    Добавить комментарий