LINUX.ORG.RU

На чем удобно делать GUI?

 


1

3

Ищу нечто, где просто и легко можно создавать GUI, с минимумом писанины кода (желательно, не трогая визуальные средства и всякие XML). Не важно под какую платформу (если даже оно под Amiga), не важно какого года, не важно какие требования к ресурсам или зависимостям. Особенно интересны средства, где можно сделать тысячу окошек с разными кисточками/палитрами (как в Гимпе), склеивать/разделять эти окошки в рантайме, при этом желательно не изводить пользователя тысячей нативных окон, как это когда-то делал Гимп.

Groovy SwingBuilder. Минимум кода ибо Groovy, удобненко интерфейсы генерить. Правда тормозит-с, ибо опять таки Groovy.

Deleted
()
Ответ на: комментарий от Deleted
...
            </p>
            <h2>header.one.
            <div style="border: 1px solid red; margin: 15px; text-align: left;">
                <object type="text/groovy"><![CDATA[
import net.miginfocom.swing.MigLayout
import net.miginfocom.layout.LC
import net.miginfocom.layout.AC
import net.miginfocom.layout.CC

/**
 * A script expected to run in SwingBuilder#build
 *
 * It demonstrates defining the layout using LC, AC objects.
 */
final LC layC = new LC().fill().wrap();
final AC colC = new AC().align("right", 0).fill(1, 3).grow(100, 1, 3).align("right", 2).gap("15", 1);
final AC rowC = new AC().index(6).gap("15!").align("top").grow(100, 8);

final def migLayout = new MigLayout( layC, colC, rowC )
panel(layout: migLayout) {
    label("Last Name")
...

1. Я конечно просил чего-то оригинального...

2. А это действительно то, что я искал?

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

А это действительно то, что я искал?

Да

минимумом писанины кода (желательно, не трогая визуальные средства и всякие XML). Не важно под какую платформу (если даже оно под Amiga), не важно какого года, не важно какие требования к ресурсам или зависимостям.

Под все подходит. Надо только немного расширить сознание до понимания Groovy. Будет минимум кода, можно переиспользовать все по максимуму.

Ты не тот пример нашел. Вот нормальный:

    import groovy.swing.SwingBuilder  
    import static javax.swing.JFrame.EXIT_ON_CLOSE  
    import static java.awt.BorderLayout.*  
      
    def swing = new SwingBuilder()  
    swing.edt {  
       frame( title: "File Viewer", pack: true, show: true,  
              defaultCloseOperation: EXIT_ON_CLOSE, id: "frame" ) {  
          borderLayout()  
          panel( constraints: NORTH ) {  
             borderLayout()  
             textField( id: "filename", constraints: CENTER )  
             button( "Load", constraints: EAST, actionPerformed: { evt ->  
                doOutside {  
                   def contents = new File(filename.text).text  
                   doLater { fileview.text = contents }  
                }  
             })  
          }  
          scrollPane( constraints: CENTER ) {  
             editorPane( id: "fileview", editable: false )  
          }  
       }  
    }  
      
    swing.doLater { frame.size = [480,320] }  
Deleted
()
Ответ на: комментарий от Deleted

Надо только немного расширить сознание до понимания Groovy.

Собственно, за расширением сознания я сюда и пришел. Пример шикарный. Пугает правда полное незнание Groovy и попытка его выучить несколько лет назад кончилась ничем, после жабки он какой-то странный. Вот к примеру, фигурные скобки у scrollPane - это что? Что такое doLater?

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

Что такое doLater?

передача в doLater замыкания аналогична вызову SwingUtilities.invokeLater(Runnable r). Иначе говоря, все построение/обновление UI будет идти в отдельном потоке. Короче, почитай

фигурные скобки у scrollPane - это что?

Это замыкание. Таким образом ты здесь задаешь дочерний объект, в данном случае ты в ScrollPane добавляешь EditorPane.

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

Таким образом ты здесь задаешь дочерний объект, в данном случае ты в ScrollPane добавляешь EditorPane.

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

будет идти в отдельном потоке

def contents = new File(filename.text).text  
doLater { fileview.text = contents }

Если создание окна в новом треде я еще понимаю, то вот такое...

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

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

Правильно, это ж просто синтаксический сахар над джавовским Swing.

Если создание окна в новом треде я еще понимаю, то вот такое...

Тут файл читается и отображается в контроле, если ты будешь в UI-потоке это делать, то на больших файлах будет подвисать UI.

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

Ну, тогда можно еще глянуть JavaFX+Nashorn: тоже не быстро, но «на острие прогресса» :)

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