Jawa / Говнокод #26816 Ссылка на оригинал

0

  1. 1
про свинг

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

Запостил: MAKAKA MAKAKA, (Updated )

Комментарии (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ов очень много разных: можно распологать последовательно,
    табличкой, кусочками итд.
    Ответить
  • Писали когда-нить гуй на джабе?
    Помните, что такое "апплеты"?
    Ответить
      • wx не юзал, но пытался. То есть я скачал библу и забыл что я скачал библу.
        А так я пользоваться fltk4
        Ответить
        • чего этоты так неуважительно?

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

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

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

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

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

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

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

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

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8