Jump to content

Качели (Ява)

(Перенаправлено с Java Swing )
Пример виджетов Swing на Java

Swing — это с графическим интерфейсом набор инструментов виджетов для Java . [1] Он является частью Oracle ( JFC Java Foundation Classes ) — API для предоставления графического пользовательского интерфейса (GUI) для программ Java.

Swing был разработан для предоставления более сложного набора компонентов графического пользовательского интерфейса , чем более ранний набор инструментов Abstract Window Toolkit (AWT) . Swing обеспечивает внешний вид , который имитирует внешний вид нескольких платформ, а также поддерживает подключаемый внешний вид , который позволяет приложениям иметь внешний вид, не связанный с базовой платформой. Он имеет более мощные и гибкие компоненты, чем AWT. В дополнение к знакомым компонентам, таким как кнопки, флажки и метки, Swing предоставляет несколько расширенных компонентов, таких как панель с вкладками, панели прокрутки, деревья, таблицы и списки. [2]

В отличие от компонентов AWT, компоненты Swing не реализуются с помощью кода, специфичного для платформы. Вместо этого они полностью написаны на Java и, следовательно, не зависят от платформы.

В декабре 2008 года компания Sun Microsystems (предшественник Oracle) выпустила платформу на основе CSS / FXML , которую она намеревалась стать преемником Swing, под названием JavaFX . [3]

История [ править ]

Классы Internet Foundation (IFC) — графическая библиотека для Java, первоначально разработанная Netscape Communications Corporation и впервые выпущенная 16 декабря 1996 года. 2 апреля 1997 года Sun Microsystems и Netscape Communications Corporation объявили о своем намерении объединить IFC с другими технологиями для образуют классы Java Foundation . [4] «Классы Java Foundation» позже были переименованы в «Swing». [ нужны разъяснения ]

Swing представил механизм, который позволял изменять внешний вид каждого компонента приложения без внесения существенных изменений в код приложения. Введение поддержки подключаемого внешнего вида позволяет компонентам Swing имитировать внешний вид собственных компонентов, сохраняя при этом преимущества независимости от платформы. Первоначально распространявшаяся как отдельно загружаемая библиотека, Swing была включена в состав Java Standard Edition начиная с версии 1.2. [5] Классы и компоненты Swing содержатся в файле javax.swing иерархия пакетов .

Разработка преемника Swing, JavaFX , началась в 2005 году и была официально представлена ​​два года спустя на JavaOne 2007. [6] JavaFX был открыт с открытым исходным кодом в 2011 году, а в 2012 году он стал частью загрузки Oracle JDK. JavaFX заменяет Swing благодаря нескольким преимуществам, в том числе большей легкости, наличию стилей CSS , изящным элементам управления дизайном, а также использованию FXML и Scene Builder. [7] В 2018 году JavaFX был включен в состав OpenJDK в рамках проекта OpenJFX, чтобы ускорить его развитие. [8]

В состав команды Java Client, отвечавшей за Swing, входили Джеймс Гослинг (архитектор), Рик Левенсон (менеджер), Эми Фаулер и Ханс Мюллер (технические руководители), Том Болл, Джефф Динкинс, Жорж Сааб, [9] Тим Принцинг, Джонни Канерва, Жаннетт Хунг и Джим Грэм (2D-графика). [10]

Архитектура [ править ]

Swing — это независимая от платформы « модель-представление-контроллер » среда графического пользовательского интерфейса для Java, которая следует модели однопоточного программирования . [11] Кроме того, эта платформа обеспечивает уровень абстракции между структурой кода и графическим представлением графического интерфейса на основе Swing.

Фундаменты [ править ]

Swing не зависит от платформы, поскольку полностью написан на Java. Полную документацию для всех классов Swing можно найти в Руководстве по API Java для версии 6 или в спецификации API Java Platform Standard Edition 8 для версии 8.

Расширяемый [ править ]

Swing — это архитектура с высокой степенью модульности, которая позволяет «подключать» различные пользовательские реализации определенных интерфейсов платформы: пользователи могут предоставлять свои собственные реализации этих компонентов для переопределения реализаций по умолчанию, используя механизм наследования Java через LookAndFeel.

Swing — это компонентная платформа , все компоненты которой в конечном итоге являются производными от JComponent сорт. Объекты Swing асинхронно запускают события, имеют привязанные свойства и реагируют на документированный набор методов, специфичных для компонента. Компоненты Swing — это компоненты JavaBeans , соответствующие спецификации JavaBeans .

Настраиваемый [ править ]

Сильная зависимость Swing от механизмов времени выполнения и шаблонов косвенной композиции позволяет ему реагировать во время выполнения на фундаментальные изменения в его настройках. Например, приложение на основе Swing может выполнять горячую замену пользовательского интерфейса во время выполнения. Более того, пользователи могут предоставить свою собственную реализацию внешнего вида, которая позволяет единообразно изменять внешний вид существующих приложений Swing без каких-либо программных изменений в коде приложения.

Легкий пользовательский интерфейс [ править ]

Высокий уровень гибкости Swing отражается в присущей ему способности переопределять собственные элементы управления графическим интерфейсом операционной системы (ОС) для отображения самого себя. Swing «рисует» свои элементы управления с помощью API-интерфейсов Java 2D, а не вызывает собственный набор инструментов пользовательского интерфейса. Таким образом, компонент Swing не имеет соответствующего собственного компонента графического интерфейса ОС и может свободно отображать себя любым способом, который возможен с помощью базовых графических графических интерфейсов пользователя.

Однако по своей сути каждый компонент Swing опирается на контейнер AWT , поскольку (Swing) JComponent расширяет контейнер (AWT). Это позволяет Swing подключаться к системе управления графическим интерфейсом операционной системы, включая важные сопоставления устройств и экранов и взаимодействия с пользователем, такие как нажатия клавиш или движения мыши. Swing просто «переносит» свою собственную (независимую от ОС) семантику на базовые (зависящие от ОС) компоненты. Так, например, каждый компонент Swing рисует свою версию на графическом устройстве в ответ на вызов методаComponent.paint(), который определен в (AWT) Container. Но в отличие от компонентов AWT, которые делегировали рисование своему «тяжеловесному» виджету, родному для ОС, компоненты Swing отвечают за собственный рендеринг.

Это транспонирование и разделение не просто визуальное, оно распространяется на управление Swing и применение его собственной независимой от ОС семантики для событий, запускаемых в его иерархиях включения компонентов. Вообще говоря, архитектура Swing делегирует задачу отображения различных разновидностей семантики графического интерфейса ОС в простой, но обобщенный шаблон контейнеру AWT. Опираясь на эту обобщенную платформу, он устанавливает собственную богатую и сложную семантику графического интерфейса в форме JComponent модель.

Слабосвязанность и MVC [ править ]

Библиотека Swing активно использует модель-представление-контроллер программного обеспечения шаблон проектирования . [12] который концептуально отделяет просматриваемые данные от элементов управления пользовательского интерфейса, через которые они просматриваются. По этой причине большинство компонентов Swing имеют связанные модели (которые определены в терминах интерфейсов Java ), и программисты могут использовать различные реализации по умолчанию или предоставлять свои собственные. Платформа предоставляет реализации интерфейсов модели по умолчанию для всех ее конкретных компонентов. Типичное использование платформы Swing не требует создания пользовательских моделей, поскольку платформа предоставляет набор реализаций по умолчанию, которые по умолчанию прозрачно связаны с соответствующими JComponent дочерний класс в библиотеке Swing. В общем, только сложные компоненты, такие как таблицы, деревья и иногда списки, могут потребовать реализации специальной модели вокруг структур данных, специфичных для приложения. Чтобы получить хорошее представление о потенциале, который открывает архитектура Swing, рассмотрим гипотетическую ситуацию, когда пользовательские модели для таблиц и списков являются обертками над DAO и/или EJB службами .

Обычно объекты модели компонента Swing отвечают за предоставление краткого интерфейса, определяющего запускаемые события, и доступные свойства для (концептуальной) модели данных для использования связанным JComponent. Учитывая, что общий шаблон MVC представляет собой слабосвязанный шаблон отношений совместных объектов, модель предоставляет программные средства для подключения прослушивателей событий к объекту модели данных. Как правило, эти события ориентированы на модель (например, событие «вставка строки» в табличную модель) и сопоставляются специализацией JComponent с значимым событием для компонента графического интерфейса.

Например, JTable есть модель под названием TableModel который описывает интерфейс доступа таблицы к табличным данным. Реализация по умолчанию работает с двумерным массивом .

Компонент представления Swing JComponent — это объект, используемый для графического представления концептуального элемента управления графическим интерфейсом. Отличие Swing как среды графического пользовательского интерфейса заключается в том, что он полагается на программно отображаемые элементы управления графическим интерфейсом (в отличие от использования собственных элементов управления графического интерфейса основной ОС). До версии Java 6 Update 10 это различие было источником сложностей при смешивании элементов управления AWT, которые используют собственные элементы управления, с элементами управления Swing в графическом интерфейсе (см. Смешивание компонентов AWT и Swing ).

Наконец, с точки зрения визуальной композиции и управления, Swing предпочитает относительные макеты (которые определяют позиционные отношения между компонентами), а не абсолютные макеты (которые определяют точное расположение и размер компонентов). Этот уклон в сторону «плавного» визуального порядка обусловлен тем, что он зародился в операционной среде апплета , которая легла в основу дизайна и разработки исходного набора инструментов Java GUI. (Концептуально этот взгляд на управление макетом очень похож на тот, который используется для рендеринга HTML-контента в браузерах, и решает тот же набор проблем, которые мотивировали первый.)

Связь с AWT [ править ]

Иерархия классов AWT и Swing

Начиная с ранних версий Java, часть Abstract Window Toolkit (AWT) предоставляла независимые от платформы API для компонентов пользовательского интерфейса. В AWT каждый компонент визуализируется и контролируется собственным одноранговым компонентом, специфичным для базовой оконной системы.

Напротив, компоненты Swing часто описываются как легковесные , поскольку они не требуют выделения собственных ресурсов в наборе оконных инструментов операционной системы. Компоненты AWT называются тяжеловесными компонентами . [13]

Большая часть API Swing обычно является дополнительным расширением AWT, а не прямой заменой. Фактически, каждый облегченный интерфейс Swing в конечном итоге существует внутри тяжеловесного компонента AWT, поскольку все компоненты верхнего уровня в Swing ( JApplet, JDialog, JFrame, и JWindow) расширить контейнер верхнего уровня AWT. До версии Java 6 Update 10 использование как облегченных, так и тяжелых компонентов в одном окне обычно не поощрялось из-за несовместимости Z-порядка . Однако в более поздних версиях Java эти проблемы были исправлены, и теперь компоненты Swing и AWT можно использовать в одном графическом интерфейсе без проблем с Z-порядком.

Основные функции рендеринга, используемые Swing для рисования своих облегченных компонентов, предоставляются Java 2D , еще одной частью JFC.

с SWT Связь

Standard Widget Toolkit (SWT) — это конкурирующий набор инструментов, первоначально разработанный IBM и теперь поддерживаемый Eclipse сообществом . Реализация SWT имеет больше общего с тяжелыми компонентами AWT. Это дает такие преимущества, как более точное соответствие базовому встроенному набору оконных инструментов за счет более широкого использования собственной платформы в модели программирования.

Были серьезные споры и предположения о производительности SWT по сравнению с Swing; некоторые намекнули, что из-за сильной зависимости SWT от JNI он будет медленнее, когда компоненту GUI и Java необходимо передавать данные, но быстрее при рендеринге, когда модель данных загружена в графический интерфейс, но это так или иначе не было подтверждено. [14] Достаточно тщательный набор тестов в 2005 году пришел к выводу, что ни Swing, ни SWT в общем случае явно не превосходят друг друга. [15]

Примеры [ править ]

Привет, мир [ править ]

В этом примере приложение Swing создает одно окно с надписью «Hello, world!» внутри:

// Hello.java (Java SE 8)
import javax.swing.*;

public class Hello extends JFrame {
    public Hello() {
        super("Hello World");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        add(new JLabel("Hello, world!"));
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(Hello::new);
    }
}

Первый import включает в себя все общедоступные классы и интерфейсы из javax.swing упаковка.

The Hello сорт extends тот JFrame сорт; тот JFrame Класс реализует окно со строкой заголовка и элементом управления закрытием .

The Hello() конструктор инициализирует кадр, сначала вызывая конструктор суперкласса, передавая параметр "Hello World", который используется в качестве заголовка окна. Затем он вызывает setDefaultCloseOperation(int) метод, унаследованный от JFrame чтобы установить операцию по умолчанию, когда элемент управления закрытием в строке заголовка выбран для WindowConstants.EXIT_ON_CLOSE – это вызывает JFrame быть удаленным при закрытии фрейма (а не просто скрытым), что позволяет виртуальной машине Java выйти и завершить работу программы. Далее, JLabel создается для строки «Hello, world!» и add(Component) метод, унаследованный от Container суперкласс вызывается для добавления метки в кадр. pack() метод, унаследованный от Window Суперкласс вызывается для определения размера окна и размещения его содержимого. setVisible(boolean) метод, унаследованный от Component суперкласс вызывается с логическим параметром true, что приводит к отображению кадра.

The main() Метод вызывается виртуальной машиной Java при запуске программы. Он создает новый Hello рамка. В коде используется invokeLater(Runnable) метод для вызова конструктора из потока диспетчеризации событий AWT , чтобы гарантировать, что код выполняется потокобезопасным способом . После отображения кадра выход из main Метод не приводит к завершению программы, поскольку поток диспетчеризации событий остается активным до тех пор, пока все окна верхнего уровня Swing не будут удалены.

Окно с кнопкой [ править ]

Базовый пример кода, работающего в Windows 7

Ниже представлена ​​довольно простая программа на основе Swing. Отображается окно ( JFrame), содержащий метку и кнопку.

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
 
public class SwingExample implements Runnable {
    private JFrame f;
    public SwingExample()  {
        // Create the window
        f = new JFrame("Hello World!");
        // Sets the behavior for when the window is closed
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        // Add a layout manager so that the button is not placed on top of the label
        f.setLayout(new FlowLayout());
        // Add a label and a button
        f.add(new JLabel("Hello, world!"));
        f.add(new JButton("Press me!"));   
    }

    @Override
    public void run() {
        // Arrange the components inside the window
        f.pack();
        // By default, the window is not visible. Make it visible.
        f.setVisible(true);
    }
 
    public static void main(String[] args) {
        // Schedules the application to be run at the correct time in the event queue.
        SwingUtilities.invokeLater(new SwingExample());
    }

}

Обратите внимание, что все создание экземпляров и обработка компонентов Swing выполняются путем создания экземпляра класса. который реализует интерфейс Runnable. Затем это запускается в потоке диспетчеризации событий с помощью метода SwingUtilities.invokeLater(Runnable)), созданный в основном методе (см. Swing и потокобезопасность ). Хотя код Swing можно запускать и без использования этой техники (например, не реализуя Runnable и перемещая все команды из метода run в основной метод), это считается хорошим тоном, поскольку Swing не является потокобезопасным , а это означает, что вызов ресурсов из нескольких потоков может привести к взаимодействию потоков и ошибкам согласованности памяти. [16]

Другой пример [ править ]

В этом примере пусть javax.swing.JFrame будет суперклассом и добавьте к нему наши собственные виджеты (в данном случае JButton).

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Sample extends JFrame {
	private final JButton b = new JButton();

	public Sample() {
		super();
		this.setTitle("HelloApp");
		this.getContentPane().setLayout(null);
		this.setBounds(100, 100, 180, 140);
		this.add(makeButton());
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	private JButton makeButton() {
		b.setText("Click me!");
		b.setBounds(40, 40, 100, 30);
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(b, "Hello World!");
			}
		});
		return b;
	}

	public static void main(String[] args) throws InvocationTargetException, InterruptedException {
		// Swing calls must be run by the event dispatching thread.
		SwingUtilities.invokeAndWait(() -> new Sample());
	}
}

Для макета установлено значение null с помощью Container.setLayout(LayoutManager) метод, поскольку JFrame использует java.awt.BorderLayout в качестве менеджера макетов по умолчанию. При использовании BorderLayout все, что добавляется в контейнер, помещается в центр и растягивается для размещения любых других виджетов. Конечно, большинство реальных приложений с графическим интерфейсом предпочитают использовать менеджер компоновки вместо того, чтобы размещать все в абсолютных координатах. [17]

См. также [ править ]

Ссылки [ править ]

Цитаты [ править ]

  1. ^ «Что такое Java Swing? — Определение из Techopedia» . Техопедия Инк . Проверено 3 ноября 2018 г.
  2. ^ Яп, Чи (30 апреля 2003 г.). «РУКОВОДСТВО ПО JAVA SWING GUI» . Нью-Йоркский университет (NYU) . Проверено 3 ноября 2018 г.
  3. ^ «Разработка базового приложения с графическим интерфейсом с использованием JavaFX в Eclipse» . июль 2017.
  4. ^ «Sun и Netscape будут совместно разрабатывать классы Java Foundation» . Корпорация Netscape Communications . 2 апреля 1997 г. Архивировано из оригинала 9 мая 2012 г. Проверено 8 августа 2011 г.
  5. ^ «SUN ПРЕДСТАВЛЯЕТ НОВУЮ ВЕРСИЮ ПЛАТФОРМЫ JAVA» . Сан Микросистемс . Август 2007. Архивировано из оригинала 16 августа 2007 года . Проверено 8 января 2012 г. Классы Java Foundation теперь являются ядром платформы Java 2 и включают в себя: набор компонентов графического пользовательского интерфейса Project Swing, Drag & Drop, Java 2D API, который предоставляет новые возможности 2D-графики и AWT, а также поддержку печати, интерфейс внешнего вида Java. , Новый API специальных возможностей {{cite web}}: CS1 maint: неподходящий URL ( ссылка )
  6. ^ «Обновление JDK 11: JavaFX будет отделен от JDK» .
  7. ^ «Разработка базового приложения с графическим интерфейсом с использованием JavaFX в Eclipse» . июль 2017.
  8. ^ Смит, Дональд (7 марта 2018 г.). «Будущее JavaFX и других обновлений дорожной карты Java-клиентов» .
  9. ^ Захур, Шарон. «Почему свинг называется свингом?» . Блог учебных пособий по Java . Проверено 24 сентября 2020 г.
  10. ^ Джон, Ю (27 августа 2003 г.). «Насыщенные клиенты становятся альтернативой веб-приложениям» . Компьютерный мир . Проверено 24 сентября 2020 г.
  11. ^ Жуковски, Джон (21 августа 2007 г.). «Потоки Swing и поток диспетчеризации событий» . JavaWorld . Проверено 26 июля 2020 г.
  12. ^ Фаулер, Эми. «Обзор архитектуры Swing» . Сан Микросистемс . Проверено 26 июля 2020 г.
  13. ^ Захур, Шарон; Петров, Энтони (апрель 2010 г.). «Смешивание тяжелых и легких компонентов» . Оракул . Проверено 26 июля 2020 г.
  14. ^ Стренн, Стивен (3 марта 2006 г.). «Производительность Swing против SWT — взгляните на стеки вызовов» . Джавалобби . Архивировано из оригинала 17 сентября 2017 г.
  15. ^ Жагар, Клемен; Крижнар, Игорь (3 марта 2006 г.). «Сравнение характеристик SWT и Swing» (PDF) (изд. 1.4). Козилаб. Архивировано из оригинала (PDF) 26 мая 2015 г. Трудно дать эмпирическое правило, согласно которому SWT превзойдет Swing или наоборот. В некоторых средах (например, Windows) SWT является победителем. В других (Linux, VMware, хостинг Windows) Swing и его оптимизация перерисовки значительно превосходят SWT. Различия в производительности значительны: часто встречаются коэффициенты 2 и более в обе стороны.
  16. ^ http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html Поток отправки событий
  17. ^ Экель, Брюс (2006). Мышление на Java (PDF) (4-е изд.). Прентис Холл. п. 942. ИСБН  978-0131872486 . Архивировано из оригинала (PDF) 14 мая 2016 года . Проверено 13 мая 2016 г.
  18. ^ «Главная страница разработчика JavaFX» . www.oracle.com .

Источники [ править ]

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b1aac2f917ad689135c1a2129a139feb__1716875220
URL1:https://arc.ask3.ru/arc/aa/b1/eb/b1aac2f917ad689135c1a2129a139feb.html
Заголовок, (Title) документа по адресу, URL1:
Swing (Java) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)