Помощь студентам дистанционного обучения: тесты, экзамены, сессия
Помощь с обучением
Оставляй заявку - сессия под ключ, тесты, практика, ВКР
Заявка на расчет

Ответы на вопросы по программированию (Вариант 4)

Автор статьи
Валерия
Валерия
Наши авторы
Эксперт по сдаче вступительных испытаний в ВУЗах
7. Рисование готовых элементов. Для рисования фигур требуется выполнять следующие действия: 1. Получить объект класса Graphics2D. Этот класс является подклассом класса Graphics. Начиная с версии Java SE 1.2, методы вроде paint() и paintComponent() автоматически получают объект класса Graphics2D. Поэтому остается лишь применить приведение типа, как показано ниже: public void paintComponent(Graphics g) { Graphics2d g2 = (Graphics2d)g; } 2. Использовать метод setRenderingHints() для добавления рекомендации по визуализации(rendering hints) в целях достижения компромисса между скоростью и качеством рисования. RenderingHints hints = …; g2.SetRenderingHints(hints); 3. Использовать метод setStroke() для указания штриха(stroke), который должен применяться для прорисовки контура фигуры. Для этого штриха можно выбирать толщину, а также сплошную или пунктирную линию. Stroke stroke = …; g2.setStroke(stroke); 4. Использовать метод setPaint() для указания расцветки(paint). Расцветка подразумевает закрашивание областей, вроде пути штриха или внутренней части фигуры. Она может состоять из одного сплошного цвета, нескольких меняющийся оттенков или мозаичных узоров. Paint paint = …; g2.setPaint(paint); 5. Использовать метод setClip() для установки области отсечения. Shape clip = …; g2.clip(clip); 6. Использовать метод setTransform() для преобразования(трансформации) координат рисунка из относительной пользовательской системы координат в абсолютную систему координат устройства. Это преобразование следует применять в тех случаях, когда проще создать фигуру в пользовательской системе координат, чем использовать координаты, выраженные в пикселях. AffineTransform transform = …; g2.transform(transform); 7. Использовать метод setComposite() для задания правил композиции, описывающих, каким именно образом новые пиксели должны объединяться с уже существующими. Composite (composite) = …; g2.setComposite(composite); 8. Создавать фигуру. В Java 2D API предусмотрено много объектов-фигур и методов для их комбинирования. Shape shape = …; 9. Рисовать или заливать фигуру. Под рисованием подразумевается очерчивание контуров фигуры, а под заливкой — закрашивание ее внутренней части. g2.draw(shape); g2.fill(shape); Разумеется, на практике выполнять все эти действия обычно не нужно, поэтому для многих параметров двухмерного(2D) графического контекста предусмотрены значения по умолчанию, изменять которые можно только в случае особой необходимости. 10.Стандартные события. Адаптеры. Диспетчеризация. Событие в объектно-ориентированном программировании — это сообщение, которое возникает в различных точках исполняемого кода при выполнении определённых условий. События предназначены для того, чтобы иметь возможность предусмотреть реакцию программного обеспечения. Обработка любого события (нажатие кнопки, щелчок мышью и др.) состоит в связывании события с методом, его обрабатывающим. Принцип обработки событий, начиная с Java 2, базируется на модели делегирования событий. В этой модели имеется блок прослушивания события (EventListener), который ждет поступления события определенного типа от источника, после чего обрабатывает его и возвращает управление. Источник – это объект, который генерирует событие, если изменяется его внутреннее состояние, например, изменился размер, изменилось значение поля, произведен щелчок мыши по форме или выбор значения из списка. После генерации объект-событие пересылается для обработки зарегистрированному в источнике блоку прослушивания как параметр его методов – обработчиков событий. Источником событий могут являться элементы управления: кнопки (JButton, JCheckbox, JRadioButton), списки, кнопки-меню. События могут генерироваться фреймами и апплетами, как mouse- и key-события. События генерируются окнами при развертке, сворачивании, выходе из окна. Каждый класс-источник определяет один или несколько методов addСобытиеListener() или наследует эти методы Когда событие происходит, все зарегистрированные блоки прослушивания уведомляются и принимают копию объекта события. Таким образом источник вызывает метод-обработчик события, определенный в классе, являющемся блоком прослушивания, и передает методу объект события в качестве параметра. В качестве блоков прослушивания на практике используются внутренние классы. В этом случае в методе, регистрирующем блок прослушивания в качестве параметра, используется объект этого внутреннего класса. Применимость: Паттерн (Адаптер) можно часто встретить в Java-коде, особенно там, где требуется конвертация разных типов данных или совместная работа классов с разными интерфейсами. Примеры Адаптеров в стандартных библиотеках Java: •java.util.Arrays#asList() •java.util.Collections#list() •java.util.Collections#enumeration() •java.io.InputStreamReader(InputStream) (возвращает объект Reader) •java.io.OutputStreamWriter(OutputStream) (возвращает объект Writer) •javax.xml.bind.annotation.adapters.XmlAdapter#marshal() и #unmarshal() Признаки применения паттерна: Адаптер получает конвертируемый объект в конструкторе или через параметры своих методов. Методы Адаптера обычно совместимы с интерфейсом одного объекта. Они делегируют вызовы вложенному объекту, превратив перед этим параметры вызова в формат, поддерживаемый вложенным объектом. Динамическая диспетчеризация методов – это специальный механизм, который позволяет вызвать переопределенный метод в процессе выполнения программы а не во время компиляции. Динамическая диспетчеризация методов важна при реализации полиморфизма. Динамическая диспетчеризация методов важна потому, что именно с ее помощью Java реализует полиморфизм времени выполнения. Рассмотрение этой концепции начнем с повторной формулировки одного важного принципа: ссылочная переменная суперкласса может ссылаться на объект подкласса. Система Java использует этот факт для разрешения обращений к переопределенным методам во время выполнения. Вот как это происходит. Когда вызов переопределенного метода реализуется посредством ссылки на суперкласс, Java выбирает нужную версию этого метода в зависимости от типа объекта ссылки в момент вызова. Таким образом, этот выбор осуществляется во время выполнения. При ссылке на различные типы объектов программа будет обращаться к различным версиям переопределенного метода. Иначе говоря, выбор для выполнения версии переопределенного метода осуществляется в зависимости от типа объекта ссылки (а не от типа ссылочной переменной). Следовательно, если суперкласс содержит метод, переопределяемый подклассом, то при наличии ссылки на различные типы объектов через ссылочную переменную суперкласса программа будет выполнять различные версии метода.

11.Создание собственных событий и слушателей.

Задача такова: после получения и обработки команды из COM-порта, должно появиться событие извещающее слушателей об этом. Прежде всего нужно создать класс события, наследуемый от java.util.EventObject. В нем для удобства можно реализовать несколько конструкторов. Пример такого класса: import java.util.EventObject; public class CommandDataAvailiableEvent extends EventObject { private String message; public CommandDataAvailiableEvent(Object source, String message) { super(source); this.message = message; } public CommandDataAvailiableEvent(Object source){ this(source, «»); } public CommandDataAvailiableEvent(String s){ this(null, s); } public String getMessage(){ return message; } @Override public String toString(){ return getClass().getName() + «[source = » + getSource() + «, message = » + message + «]»; } } Далее следует определить интерфейс, который будут реализовывать все слушатели события. В интерфейсе должна быть объявлена функция, обрабатывающая событие: public interface CommandDataAvailiableListener { public void commandDataAvailiable(CommandDataAvailiableEvent e); } В классе, генерирующему события, необходимо объявить коллекцию, в которой будут храниться ссылки на слушателей: private ArrayList listeners = new ArrayList(); А после этого добавить несколько функций для обработки списка слушателей: • добавление слушателя public void addComDataEnableEventListener(ComDataEnableEventListener listener){ listeners.add(listener); } • получение массива слушателй public ComDataEnableEventListener[] getComDataEnableEventListeners(){ return listeners.toArray(new ComDataEnableEventListener[listeners.size()]); } • удаление слушателя public void removeComDataEnableEventListener(ComDataEnableEventListener listener){ listeners.remove(listener); } • генерирования события protected void fireDataAvaliableEvent(String message){ ComDataEnableEvent ev = new ComDataEnableEvent(this, message); for (ComDataEnableEventListener listener : listeners){ listener.DataAvaliableEvent(ev); } } На этом создание события завершено. Теперь, чтобы сгенерировать событие необходимо только вызвать функцию fireDataAvaliableEvent, и уведомления будут высланы всем слушателям.

12.События мыши.

Для того, чтобы прослушивать события мыши необходимо реализовать интерфейс MouseListener, который располагается в пакете java.awt.event. По аналогии с другими слушателями swing, MouseListener — это интерфейс, методы которого необходимо реализовать. Рассмотрим методы, которые требуют реализации. Всего их пять. Условно методы можно разделить на две части. Первые два метода, говоря простым языком, отвечают за движение курсора, то есть будут вызываться при движении курсора мыши (навели и убрали курсор с компонента). Остальные три будут вызываться при нажатии кнопок. Начнем рассмотрение с mouseEntered. Данный метод будет вызываться системой у слушателя каждый раз, когда курсор мыши будет оказываться над компонентом. В противоположность этому методу — mouseExited. Он срабатывает, когда убираем курсор мыши с компонента. Пример — у нас есть компонент. Мы добавили к нему слушателя MouseListener. Начинаем водить мышкой. Как только «залезли» курсором на компонент — вызвался mouseEntered, уводим курсор с компонента — вызвался mouseExited. Каждый раз при нажатии одной из кнопок мыши будет срабатывать mousePressed. Навели на компонент, зажали кнопку — система вызвала mousePressed. Отпускаем кнопку — mouseReleased. Здесь всё просто. И самое интересное — это mouseClicked. По идее клик (click) — это когда пользователь нажал и отпустил одну из кнопок, но тут тоже есть свой момент. Если позиция курсора не меняется между зажатием и отпусканием кнопки, то mouseClicked срабатывает, если же зажали кнопку, сменили положение курсора — передвинули его куда-нибудь, но не убрали с компонента а затем отпустили, то mouseClicked не вызовется. Интерфейс MouseListener реализован, что дальше? Дальше нужно добавить слушателя к компоненту при помощи метода addMouseListener и прослушивать события. В случае необходимости можно удалить слушателя при помощи removeMouseListener. Рассмотрим тестовое приложение. Здесь располагается кнопка. Если поиграться с курсором и мышью, то внизу кнопки будет показываться текстовая надпись о наступлении событий — вызове методов слушателя. mouselistener_using import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class TestFrame extends JFrame { private JLabel eventLabel; public TestFrame() { super(«Test frame»); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); JPanel buttonsPanel = new JPanel(); JButton button1 = new JButton(«Button 1»); button1.setPreferredSize(new Dimension(150, 80)); buttonsPanel.add(button1); button1.addMouseListener(new CustomListener()); mainPanel.add(buttonsPanel, BorderLayout.NORTH); eventLabel = new JLabel(); eventLabel.setHorizontalAlignment(JLabel.CENTER); mainPanel.add(eventLabel, BorderLayout.CENTER); getContentPane().add(mainPanel); } public static JLabel createEmptyLabel() { JLabel label = new JLabel(); label.setPreferredSize(new Dimension(100, 35)); return label; } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new TestFrame(); frame.setPreferredSize(new Dimension(330, 160)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class CustomListener implements MouseListener { public void mouseClicked(MouseEvent e) { JButton button = (JButton) e.getSource(); String text = «» + button.getText() + » mouseReleased() » + button.getText() + » mouseClicked() «;eventLabel.setText(text);} public void mouseEntered(MouseEvent e) { JButton button = (JButton) e.getSource(); eventLabel.setText(button.getText() + » mouseEntered()»); } public void mouseExited(MouseEvent e) { JButton button = (JButton) e.getSource(); eventLabel.setText(button.getText() + » mouseExited()»); } public void mousePressed(MouseEvent e) { JButton button = (JButton) e.getSource(); eventLabel.setText(button.getText() + » mousePressed()»); } public void mouseReleased(MouseEvent e) { JButton button = (JButton) e.getSource(); eventLabel.setText(button.getText() + » mouseReleased()»); } } }

13.События клавиатуры и клавиатурные сокращения.

Работая с приложением, которое имеет графический интерфейс, пользователь прибегает к помощи не только мыши, но и клавиатуры. Java Swing даёт возможность разработчику приложения обработать различные события, которые поступают от клавиатуры в то время, когда пользователь нажимает клавиши. Давайте посмотрим, что необходимо сделать, чтобы иметь возможность слушать события клавиатуры. Для этого рассмотрим интерфейс KeyListener из пакета java.awt.event. Как в случае и с обработкой других событий, для обработки событий клавиатуры необходимо реализовать специальный интерфейс, а затем добавить получившегося слушателя к интересуемому компоненту. Интерфейс, который нужно реализовать для обработки клавиш был упомянут выше – это КeyListener из пакета java.awt.event. KeyListener имеет три метода: keyTyped, keyPressed и keyReleased. Когда вызывается каждый из методов системой? Метод keyTyped вызывается системой каждый раз, когда пользователь нажимает на клавиатуре клавиши символы Unicode. Метод keyPressed вызывается системой в случае нажатия любой клавиши на клавиатуре. Метод keyReleased вызывается при отпускании любой клавиши на клавиатуре. Чтобы добавить слушателя KeyListener к интересуемому компоненту для прослушивания событий клавиатуры, используется метод addKeyListener. В качестве параметра методу передается ссылка на слушателя. Для удаления слушателя используется метод removeKeyListener. Давайте посмотрим, как можно добавить слушателя KeyListener к компоненту в самом простейшем случае. JTextField textField = new JTextField(20); textField.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } }); Здесь создается текстовое поле JTextField. Затем при помощи метода addKeyListener добавляется анонимный слушатель, который реализует все методы интерфейса KeyListener. Как правило не всегда нужно реализовывать все три метода интерфейса KeyListener. Однако если мы делаем implements KeyListener, то обязаны сделать реализацию каждого метода интерфейса, даже если они будут пустыми. На такой случай есть специальный абстрактный класс KeyAdapter, который содержит все три метода но с пустыми методами keyTyped, keyPressed и keyReleased. Тогда достаточно будет пронаследоваться от KeyAdapter и переопределить в нем только требуемый метод. Если нет необходимости реализовывать все методы KeyListener, то можно сделать вот так: textField.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { } }); Каждый раз, когда пользователь нажимает клавиши на клавиатуре и система вызывает методы keyTyped, keyPressed и keyReleased, в качестве параметра им передается объект KeyEvent, который содержит всю необходимую информацию о произошедшем событии. Отсюда можно узнать код клавиши, которая была нажата – метод getKeyCode. Были ли зажаты при этом такие клавиши, как Alt, Shift или Ctrl. Проверить это можно вызвав соответственно методы isAltDown, isShiftDown и isControlDown. Класс KeyEvent содержит большой набор констант. Каждая константа содержит код соответствующей клавиши. Поэтому нет необходимости коды всех клавиш. Достаточно использовать какую-то из констант. По названиям констант можно легко определить, какой клавише она соответствует. Например KeyEvent. VK_ENTER или KeyEvent.VK_F. Стоит сказать, что события от клавиатуры будут генерироваться системой только тогда, когда компонент, который мы слушаем, находится в фокусе. Здесь происходит обработки нажатия клавиш компонентом JPanel. Вообще по умолчанию JPanel не должен получать фокуса, однако это можно зделать, если очень захотеть при помощи метода setFocusable и передать этому методу true в качестве параметра. import java.awt.Dimension; import java.awt.Font; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class TestFrame extends JFrame { private JLabel label; public TestFrame() { super(«Test frame»); createGUI(); } public void createGUI() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.setFocusable(true); label = new JLabel(); label.setFont(new Font(«Calibri», Font.PLAIN, 20)); label.setHorizontalAlignment(JLabel.CENTER); panel.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { label.setText(e.getKeyText(e.getKeyCode())); } }); panel.add(label, BorderLayout.CENTER); setPreferredSize(new Dimension(200, 200)); getContentPane().add(panel); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame.setDefaultLookAndFeelDecorated(true); TestFrame frame = new TestFrame(); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } }

14.Очередь событий.

Если главный поток прямо сейчас занят, то он не может срочно выйти из середины одной функции и прыгнуть в другую. А потом третью. Отладка при этом могла бы превратиться в кошмар, потому что пришлось бы разбираться с совместным состоянием нескольких функций сразу. Поэтому используется альтернативный подход. Когда происходит событие, оно попадает в очередь. Внутри браузера непрерывно работает «главный внутренний цикл», который следит за состоянием очереди и обрабатывает события, запускает соответствующие обработчики и т.п. Иногда события добавляются в очередь сразу пачкой. Например, при клике на элементе генерируется несколько событий: 1.Сначала mousedown – нажата кнопка мыши. 2.Затем mouseup – кнопка мыши отпущена и, так как это было над одним элементом, то дополнительно генерируется click (два события сразу). Обычно возникающие события «становятся в очередь». Но в тех случаях, когда событие инициируется не посетителем, а кодом, то оно, как правило, обрабатывается синхронно, то есть прямо сейчас.

15.Стандартные диспетчеры компоновки.

Прежде чем приступать к написанию программ средствами Swing, необходимо составить себе хотя бы общее представление о диспетчерах компоновки. Диспетчер компоновки управляет размещением компонентов в контейнере. В Java определено несколько таких диспетчеров. Большинство из них входит в состав AWT (т.е. в пакет j ava. awt), но в Swing также предоставляется ряд дополнительных диспетчеров компоновки. Все диспетчеры компоновки являются экземплярами классов, реализующих интерфейс LayoutManager. (Некоторые из диспетчеров компоновки реализуют интерфейс LayoutManager2.) Ниже перечислен ряд диспетчеров компоновки, доступных для разработчиков прикладных программ, пользующихся средствами Swing. FlowLayout Простой диспетчер компоновки, размещающий компоненты слева направои сверху вниз. (Для некоторых региональных настроек компоненты располагаются справа налево.) BorderLayout Располагает компоненты по центру и по краям контейнера. Этот диспетчер компоновки принимается по умолчанию для панели содержимого GridLayout Располагает компоненты сеткой, как в таблице GridBagLayout Располагает компоненты разных размеров настраиваемой сеткой, как в таблице BoxLayout Располагает компоненты в блоке по вертикали или по горизонтали SpringLayout Располагает компоненты с учетом ряда ограничений

16.Продвинутые диспетчеры компоновки.

Для панели содержимого по умолчанию принимается диспетчер компоновки BorderLayout. Этот диспетчер компоновки определяет в составе контейнера пять областей, в которые могут помещаться компоненты. Первая область располагается посредине и называется центральной. Остальные четыре размещаются по сторонам света и соответственно называются северной, южной, восточной и западной. По умолчанию компонент, добавляемый на панели содержимого, располагается в центральной области. Для того чтобы расположить компонент в другой области, следует указать ее имя. Несмотря на то что возможностей, предоставляемых диспетчером компоновки BorderLayout, зачастую оказывается достаточно, иногда возникает потребность в других диспетчерах компоновки. К числу самых простых относится диспетчер компоновки FlowLayout. Он размещает компоненты построчно: слева направо и сверху вниз. Заполнив текущую строку, этот диспетчер компоновки переходит к следующей. Такая компоновка предоставляет лишь ограниченный контроль над расположением компонентов, хотя и проста в употреблении. Однако при изменении размеров контейнера расположение компонентов может измениться.

17.Вывод вспомогательной информации.

Диалоговое окно JDialog Диалоговые окна чаще всего используются в приложениях для получения дополнительной информации с целью установки параметров приложения, вывода важной вспомогательной/отладочной информации. Диалоговые окна, как правило, создаются модальными (modal), блокирующими доступ к остальным окнам приложения, пока пользователь не закончит работу с модальным диалоговым окном. Модальные диалоговые окна располагаются поверх основного окна приложения. Внешний вид диалоговых окон мало отличается от окон с рамкой JFrame, но обычно у них меньше элементов управления окна (чаще всего, имеется только кнопка закрытия окна) и отсутствует системное меню. В Swing диалоговые окна реализуются классом JDialog, унаследованном от базового класса окон JWindow и позволяющим создавать как обычные, так и модальные диалоговые окна. JDialog поддерживает как и JFrame закрытие окна, а в остальном сходен с другими окнами Swing. При создании диалоговых окон Swing необходимо указать «родительское окно», которым может быть окно с рамкой JFrame или другое диалоговое окно JDialog. Имеется также конструктор, не требующий «родительского» окна, но использующий вспомогательное прозрачное окно, о котором было сказано на странице «Окно без рамки JWindow».

18.Ввод текста.

Наиболее простой способ ввзаимодействия с пользователем представляет консоль: мы можем выводить на консоль некоторую информацию или, наоборот, считывать с консоли некоторые данные. Для взаимодействия с консолью в Java применяется класс System, а его функциональность собственно обеспечивает консольный ввод и вывод. Для получения ввода с консоли в классе System определен объект in. Однако непосредственно через объект System.in не очень удобно работать, поэтому, как правило, используют класс Scanner, который, в свою очередь использует System.in. Например, напишем маленькую программу, которая осуществляет ввод чисел: import java.util.Scanner; public class Program { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print(«Input a number: «); int num = in.nextInt(); System.out.printf(«Your number: %d \n», num); in.close(); } } Так как класс Scanner находится в пакете java.util, то мы вначале его импортируем с помощью инструкции import java.util.Scanner. Для создания самого объекта Scanner в его конструктор передается объект System.in. После этого мы можем получать вводимые значения. Например, в данном случае вначале выводим приглашение к вводу и затем получаем вводимое число в переменную num. Чтобы получить введенное число, используется метод in.nextInt();, который возвращает введенное с клавиатуры целочисленное значение. Класс Scanner имеет еще ряд методов, которые позволяют получить введенные пользователем значения: next(): считывает введенную строку до первого пробела nextLine(): считывает всю введенную строку nextInt(): считывает введенное число int nextDouble(): считывает введенное число double nextBoolean(): считывает значение boolean nextByte(): считывает введенное число byte nextFloat(): считывает введенное число float nextShort(): считывает введенное число short То есть для ввода значений каждого примитивного типа в классе Scanner определен свой метод.

19.Компоненты выбора вариантов.

Списки JList используются для визуального отображения данных. Пользователь видит весь список или большую его часть, и может выбрать один элемент списка или несколько. В отличие от обычного списка JList, раскрывающийся список JComboBox используется для выбора одной строки из нескольких вариантов и показывает только выбранный в данный момент элемент. JComboBox позволяет также вводить собственные значения. JList имеет двух поставщиков данных (модели данных). Первая модель, реализующая интерфейс ListModel, содержит элементы списка. Вторая модель ListSelectionModel реализует интерфейс ListSelectionModel и следит за выделенными элементами. По умолчанию в списке JList используется стандартная реализация модели DefaultListSelectionModel, поддерживающая все самые важные режимы выделения. Для выбора одного элемента из нескольких доступных вариантов можно использовать раскрывающиеся списки JComboBox, который в нормальном состоянии отображает только один выбранный элемент. Возможные альтернативы появляются в специальном всплывающем окне при открытии списка. Раскрывающиеся списки допускают редактирование текущего элемента. Пользователь может не только выбрать определенный элемент из списка, но и ввести свое собственное значение. Список JComboBox обладает возможностью поиска элементов с клавиатуры, что значительно упрощает работу с большими наборами. Раскрывающийся список JComboBox использует только одну модель, предоставляющую информацию об элементах списка. Свойства модели JComboBox определены интерфейсом ComboBoxModel, унаследованным от простой модели списка ListModel. Интерфейс ComboBoxModel включает дополнительно два новых метода : getSelectedItem() — для получения выбранного элемента и setSelectedItem() — для смены выбранного элемента. Помимо интерфейса модели ComboBoxModel можно использовать унаследованный от нее интерфейс MutableComboBoxModel, поддерживающий вставку и удаление произвольных элементов списка.

20.Меню.

Компонент меню JMenu библиотеки Swing позволяет создать набор элементов (пунктов меню) и представить их в интерфейсе окна. Элемент меню представляет собой кнопку, унаследованную от класса AbstractButton и отличающуюся от кнопок, флажков и переключателей только внешним видом и небольшими размерами, позволяющими им находится в JMenu. Соответствие элементов управления и элементов меню представлен в следующей таблице. Элементы управления Элементы меню Кнопка JButton элемент-меню JMenuItem Переключатель JRadioButton элемент-переключатель JRadioButtonMenuItem Флажок JCheckBox элемент-флажок JCheckBoxMenuItem В меню нет эквивалента выключателя JToggleButton. С его функциями справляются флажки и переключатели Строка меню JMenuBar представляет обыкновенный контейнер, ничем не отличающийся от панели JPanel и обладающий теми же самыми свойствами. JMenuBar может быть использована не только для работы с выпадающими меню. В строку меню можно добавлять всевозможные компоненты, например надписи со значками или раскрывающиеся списки. В качестве менеджера расположения JMenuBar использует BoxLayout с расположением компонентов по горизонтали. В представленных примерах код формирования меню «раздувает» тело основной программы. А если принять во внимание, что это не последняя Swing-программа, то целесообразно разработать загрузчик меню «на все случаи жизни», или стремиться к этому. Также было бы неплохо и описание меню вынести из основного кода. Файл описания меню может включать наименования в кириллице, поскольку загрузчик файла учитывает кодировку. Корневым узлом описания меню является элемент с названием «menubar», описывающий строку меню, в которой размещаются все выпадающие меню и его элементы. Все теги описания меню имеют атрибут «name» (имя). По имени будет выполняться поиск элемента. Чтобы при поиске элементов меню не возникало ошибок, имена всех элементов должны быть уникальными. К строке меню «menubar» присоединяются выпадающие меню : для XML-контента это означает наличие элементов-потомков с названием «menu». Как правило, для выпадающих меню настраиваются два свойства: text (текст меню) и mnemonic (символ мнемоники). Данные свойства будут задаваться в виде атрибутов элемента «menu». Для организации сложной иерархической системы меню необходимо, чтобы дочерние элементы тега «menu» были элементами типа «menuitem» (пункт меню) или «menu» (ветка меню). Тег «menuitem» определяет элемент меню, по нажатию на который должна быть выполнена команда. А дочерний тег «menu» позволяет создать в выпадающем меню раскрывающуюся ветку меню. Тег «menuitem» соддержит больше всего атрибутов : для него можно задавать не только текст меню и символ мнемоники, но и сочетание клавиш быстрого доступа (accelerator), а также его доступность для отображения в системном меню (enabled). В качестве особых элементов меню выступают разделители меню «separator», позволяющие организовывать группы элементов.

21.Диалоговые окна.

Библиотека Swing включает богатый выбор стандартных диалоговых окон, существенно упрощающих и ускоряющих вывод простой информации типа сообщений о работе программы, ошибках и нестандартных ситуациях. Для вывода в графический интерфейс приложения разнообразной информации и выбора простых данных предназначен класс JOptionPane, работа с которым связана с вызовом одного из многочисленных статических методов, создающих и выводящих на экран модальное диалоговое окно стандартного вида. В диалоговых окнах JOptionPane можно выводить самую разнообразную информацию и, при необходимости, размещать в них дополнительные компоненты. JOptionPane унаследован от базового класса JComponent библиотеки Swing, так что можно работать с ним напрямую, т.е. создавать экземпляры класса JOptionPane и настраивать их свойства. Использование стандартных диалоговых окон существенно упрощает разработку приложения и позволяет ускорить процесс освоения пользователем интерфейса. Все стандартные диалоговые окна Swing имеют собственные UI-представители, отвечающие за интерфейс окна в используемом приложении. Это особенно важно для внешних видов окон, имитирующих известные платформы, пользователи которых не должны ощущать значительной разницы при переходе от «родных» приложений к Java-приложениям. Класс JOptionPane Интерфейс экземпляра класса JOptionPane имеет структуру, представленную на следующем рисунке. Иконка в интерфейсе может отсутствовать. Основные диалоговые методы JOptionPane Наименование метода Описание showMessageDialog Диалоговое окно вывода сообщения showConfirmDialog Диалоговое окно подтверждения, с включением кнопок типа yes/no/cancel showInputDialog Диалоговое окно с выбором parent — родительское окно. message — отображаемый в окне текст сообщения. В большинстве случаев это строка, но может быть использован массив строк String[], компонент Component, иконка Icon, представленная меткой JLabel, объект Object, конвертируемый в строку методом toString(). title — заголовок окна. messageType — тип диалогового окна : •INFORMATION_MESSAGE — стандартное диалоговое окно для вывода информации со значком соответствующего вида; •WARNING_MESSAGE — стандартное диалоговое окно для вывода предупреждающей информации со значком соответствующего вида; •QUESTION_MESSAGE — стандартное диалоговое окно для вывода информации. Как правило, не используется для информационных сообщений; •ERRORMESSAGE — стандартное диалоговое окно для вывода информации об ошибке со значком соответствующего вида; •PLAIN_MESSAGE — стандартное диалоговое окно для вывода информации без значка. optionType — опция определения кнопок управления : •DEFAULT_OPTION •YES_NO_OPTION •YES_NO_CANCEL_OPTION •OK_CANCEL_OPTION selectionValues — список возможных значений. В диалоговом окне InputDialog список будет представлен в компоненте JComboBox или JList. Если selectionValues = null, то в окне будет определено поле JTextField, в которое пользователь может ввести любое значение. initialSelectionValue — инициализируемое значение. icon — отображаемая в диалоговом окне иконка.

22.Файловые диалоги.

При работе с файлами из приложения возникает необходимость рано или поздно использовать диалог для выбора файлов. JFileChooser из библиотеки Java Swing как раз является таким диалогом. Кроме того диалог JFileChooser позволяет производить навигацию по файловой системе. JFileChooser только предоставляет возможность выбора файла или директории, больше ничего с ними не делает. всё остальное — задача разработчика. Работать с ним просто и легко. Давайте разберем небольшой пример и посмотрим, что необходимо сделать, чтобы показать JFileChooser и получить информацию о том, какой выбор сделал пользователь. А кроме этого посмотрим, как настроить JFileChooser должным образом. Далее мы будем смотреть, как использовать JFileChooser в самом простейшем случае. Для того, чтобы показать диалог достаточно написать две строчки: JFileChooser fileopen = new JFileChooser(); int ret = fileopen.showDialog(null, «Открыть файл»); С помощью первой строчки мы создаем новый объект JFileChooser, а при помощи второй строчки мы отображаем диалог пользователю. Как только пользователь закрывает диалог, то в переменную ret заносится определенное значение. С помощью этого значения мы можем понять, что собственно произошло с JFileChooser: пользователь нажал отмену, или просто закрыл диалог или же возжелал открыть выбранный файл. Во фрагменте, представленном ниже мы предполагаем, что пользователь в диалоге JFileChooser выбрал файл и открыл его. При помощи метода getSelectedFile мы получаем ссылку на объект File и затем продолжаем с ним работать. JFileChooser fileopen = new JFileChooser(); int ret = fileopen.showDialog(null, «Открыть файл»); if (ret == JFileChooser.APPROVE_OPTION) { File file = fileopen.getSelectedFile(); /* * Какие-то действия. */ } Вот собственно и всё. Мы научились самой простой работе с компонентом JFileChooser. Первое, что мы сделали это научились открывать диалог и показывать его пользователю. Второе — мы сумели должным образом отреагировать на действия пользователя. И третье — получили интересующую нас информацию о выбранном пользователем файле.

23.Списки.

Интерфейс Java List, java.util.List, представляет упорядоченную последовательность объектов. Элементы, содержащиеся в списке Java, вставлять и удалять в соответствии с порядком их появления в списке. Каждый элемент в списке Java имеет индекс. Первый элемент в имеет индекс 0, второй элемент имеет индекс 1 и т.д. Вы можете добавить любой объект в список. Если список не типизирован с использованием Java Generics, то вы можете даже смешивать объекты разных типов (классов) в одном и том же списке. Java List — это стандартный интерфейс, который является подтипом Java Collection, что означает, что означает, что List наследуется от Collection. Java List и Java Set очень похожи в том, что они оба представляют коллекцию элементов. Тем не менее, есть некоторые существенные различия. Первое различие между Java List и Java Set состоит в том, что один и тот же элемент может встречаться в списке более одного раза. Это отличается от набора, где каждый элемент может встречаться только один раз. Второе различие — элементы в List имеют порядок, и элементы могут повторяться в этом порядке. Набор не предполагает порядок элементов, хранящихся внутри. Реализация List Будучи подтипом Collection, все методы в интерфейсе Collection также доступны в Listinterface. Поскольку List — это интерфейс, вам необходимо создать конкретную реализацию интерфейса, чтобы использовать его. Вы можете выбирать между следующими реализациями List в API коллекций Java: •java.util.ArrayList •java.util.LinkedList •java.util.Vector •java.util.Stack Также есть параллельные реализации List в пакете java.util.concurrent. Вставить элементы (объекты) в список Java можно методом add (). Можно добавить элемент в список по определенному индексу. Интерфейс List имеет версию метода add(), которая принимает индекс в качестве первого параметра, и элемент для вставки в качестве второго параметра. Можно добавить все элементы из одного списка в другой. Сделаем это с помощью метода ListaddAll ().Вы можете получить элементы из списка Java, используя индекс элементов. Методом get (int index). Вы можете найти элементы в списке Java, используя один из этих двух методов: 1.index() 2.LastIndexOf ()Метод indexOf () находит индекс первого вхождения в списке заданного элемента. Метод lastIndexOf () находит индекс последнего вхождения в списке данного элемента. Вы можете проверить, содержит ли Java List данный элемент, используя метод List contains ().Вы можете удалить элементы из списка Java с помощью этих двух методов: •remove(Object element) •remove(int index) remove (Object element) удаляет элемент в списке, если он присутствует. Все последующие элементы, затем перемещаются вверх по списку. Таким образом, их индекс уменьшается на 1. Интерфейс Java List содержит метод clear (), который удаляет все элементы из списка при вызове. Удаление всех элементов также называется очисткой. Метод retainAll () способен сохранять все элементы из одного списка в другом. Другими словами, метод retain () удаляет все элементы, которые не найдены в другом списке. Результатом является пересечение двух списков. Вы можете получить количество элементов вызвав метод size (). Метод subList () может создавать новый List с подмножеством элементов из исходного List. Метод subList () принимает 2 параметра: начальный индекс и конечный индекс. Начальный индекс — это индекс первого элемента из исходного списка для включения в подсписок. Конечный индекс является последним индексом подсписка, но элемент в последнем индексе не включается в подсписок. Это похоже на то, как работает метод подстроки Java String. Вы можете преобразовать список Java в набор(set), создав новый набор и добавив в него все элементы из списка. Набор удалит все дубликаты. Таким образом, результирующий набор будет содержать все элементы списка, но только один раз. Вы можете отсортировать список с помощью метода Collections sort (). Если Список содержит объекты, которые реализуют интерфейс Comparable (java.lang.Comparable), тогда эти объекты можно сравнивать. Если объекты не реализуют интерфейс Comparable или если вы хотите отсортировать объекты в порядке, отличном от их реализации compare (), вам необходимо использовать Comparatorimplementation (java.util.Comparator). Вы можете выполнить итерацию списка несколькими различными способами. Три наиболее распространенных способа: •Использование итератора •Использование цикла for-each •Использование цикла for •Использование API Java Stream

24.Таблицы. Модели таблицы.

Таблица JTable позволяет отображать двухмерную информацию в виде строк и столбцов, настраивать и сортировать данные, выводить их в любом подходящем виде, управлять заголовками таблицы и ее выделенными элементами. JTable использует три модели, поставляющие ей данные и сохраняющие изменения при изменении этих данных. Первая и самая важная модель реализует интерфейс TableModel и хранит данные ячеек таблицы и дополнительную служебную информацию об этих ячейках. Вторая модель реализует интерфейс TableColumnModel и управляет столбцами таблицы. TableColumnModel позволяет добавлять, перемещать и находить столбцы, узнавать об изменениях в их расположении, с ее помощью можно изменить расстояние между столбцами и находящимися в них ячейками. Третья модель таблицы SelectionModel используется для выделения списка. Она управляет выделением строк таблицы и не затрагивает столбцы. Модель TableColumnModel имеет собственную модель выделения списка ListSelectionModel. Так что можно формально говорить о четырех моделях таблицы JTable. Просто одна из этих моделей вызывается неявно, через другую модель. Помимо моделей таблица JTable предоставляет еще несколько удобных механизмов выделения строк, столбцов и ячеек. В модели данных таблицы можно хранить не только простые элементы, но и объекты. Для отображения в ячейке таблицы одного из атрибутов объекта используются специальные отображающие объекты, наследующие свойства DefaultTableCellRenderer. Отображающие объекты позволяет настраивать стиль и формат представления значения ячейки. Можно реализовать собственные модели таблицы, используя для каждой из них соответствующий абстрактный класс, начинающийся со слова Abstract, в котором реализованы поддержка слушателей и рассылка событий. Для каждой из моделей JTable имеется стандартная реализация, наименование класса которого начинается со слова Default. При работе с таблицами необязательно использовать модели. JTable включает конструкторы, в которые можно передать массивы или векторы с информацией о ячейках таблицы и при необходимости о названиях ее столбцов. Для простых программ и незатейливых таблиц такой подход удобнее. Значение любой ячейки таблицы в этом случае можно получить с использованием метода getValueAt(), а изменить значение ячейки можно методом setValueAt(). Таблица JTable реализует интерфейс Scrollable и ее можно добавлять в панель прокрутки JScrollPane. При прокрутке полностью появляются следующий столбец или следующая строка таблицы. Заголовок таблицы, реализованный классом JTableHeader, будет виден только при помещении таблицы в панель прокрутки, поскольку таблица размещает компонент JTableHeader в виде заголовка панели прокрутки. Таблица JTable имеет следующие типы конструкторов : Конструктор Описание JTable() Конструктор таблицы с инициализацией объекта моделями по умолчанию : моделью данных, моделью колонок, моделью выделения. JTable(int numRows, int numColumns) Конструктор таблицы с определением количества колонок и строк и с использованием модели по умолчанию DefaultTableModel. Колонки будут иметь наименования «A», «B», «C» и т.д. JTable(Object[][] rowData, Object[] columnNames) Конструктор определяет количество и наименования колонок согласно columnNames. Количество строк определены размером массива данных rowData, который используется и для заполнения таблицы. JTable(TableModel dm) Конструктор таблицы с инициализацией данных согласно модели dm; модель колонок и модель выделения по умолчанию. JTable(TableModel dm, TableColumnModel cm) Конструктор таблицы с инициализацией данных согласно модели dm, колонок согласно модели cm и модели выделения по умолчанию. JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) Конструктор таблицы с инициализацией данных согласно модели dm, колонок согласно модели cm и модели выделения sm. JTable(Vector rowData, Vector columnNames) Конструктор таблицы с инициализацией колонок согласно columnNames. Количество строк определены параметром rowData, имеющего тип Vector of Vectors Модель таблицы TableModel позволяет подробно описать каждую ячейку таблицы JTable. Определенные в модели методы позволяют получить значение произвольной ячейки и изменить его, узнать о возможности редактирования ячейки, получить информацию о столбцах (количество, наименование, тип) и строках. Основные методы модели данных TableModel Метод Описание int getRowCount() Метод возвращает количество строк в таблице. int getColumnCount() Метод возвращает количество столбцов в таблице. Object getValueAt(строка, столбец) Чтение данных ячейки таблицы. Данные могут иметь определенный тип. Метод возвращает ссылку на базовый тип Object. setColumnName(столбец) Метод определения имени столбца, которое будет отображаться в заголовке таблицы JTableHeader. Заголовок таблицы появляется при размещении таблицы в панели прокрутки. isCellEditable(строка, столбец) Метод определения возможности редактирования ячейки таблицы. setValueAt(значениe, строка, столбец) Метод используется для определения значения ячейки таблицы. Реализуйте этот метод, если в таблице есть редактируемые ячейки, иначе их значение невозможно будет поменять. getColumnClass(столбец) Метод определения типа данных, хранимых в столбце. Тип задается в виде объекта Class. На основе типа данных определяется, как следует отображать и редактировать эти данные. Таблица JTable стандартно поддерживает несколько типов данных для столбцов. Модель столбцов таблицы TableColumnModel Модель TableColumnModel позволяет настраивать столбцы таблицы JTable : устанавливать размеры столбцов, менять их местами, настраивать объекты для отображения в столбце и для редактирования ячеек столбца, управлять заголовком столбца и т.д. Таблица JTable отображает в интерфейсе порядок столбцов согласно параметрам, определенным в TableColumnModel. Каждый столбец таблицы представлен объектом TableColumn, c помощью которого указываются : •размеры столбца — столбец TableColumn, как обычный компонент, имеет предпочтительный, максимальный и минимальный размеры; •индекс столбца — в модели данных TableModel по этому индексу таблица определяет, какой набор данных отображает столбец; •объекты — для отображения и редактирования данных, хранящихся в столбце. С помощью TableColumn можно настроить и другие параметры, в том числе и модель выделения столбцов. В JTable для хранения информации о столбцах по умолчанию используется стандартная модельDefaultTableColumnModel. В подавляющем большинстве случаев ее возможностей хватает. Модель столбцов таблицы хранит список TableColumn и при смене какого-либо свойства столбца или его расположения оповещает об этом событии слушателей TableColumnModelListener. Свойства модели TableColumnModel

25.Редактирование ячеек таблицы.

За редактирование ячеек таблицы отвечает объект, реализующий интерфейс TableCellEditor, наследующий интерфейс CellEditor. Cтандартный объект для редактирования таблицы можно настроить или создать собственный объект. Объекты для редактирования также, как и отображающие объекты, делятся на два типа: объекты по умолчанию и объекты, используемые для конкретного столбца таблицы. При этом вторые имеют приоритет перед первыми. Объекты редактирования по умолчанию регистрируются посредством специальных методов класса JTable и предназначены для редактирования данных определенного типа. Тип данных столбца можно получить с использованием метода getColumnClass() модели TableModel. JTable включает редактор для текстовых данных, числовых данных и булевых переменных, в качестве редактора которого используется флажок JCheckBox. Изначально встроенные в таблицу JTable редакторы реализованы в виде DefaultCellEditor. Этот редактор ячеек реализует интерфейс TableCellEditor и позволяет использовать для редактирования данных текстовое поле JTextField, флажок JCheckBox или раскрывающийся список JComboBox. Интерфейс TableCellEditor добавляет к базовым методам родительского интерфейса CellEditor метод getTableCellEditorComponent(), который возвращает Component, используемый для редактирования ячеек. В следующем примере TableCellEditorTest создается редактируемая таблица с тремя столбцами. В первом столбце размещается обычный текст. Во втором столбце используется редактор с раскрывающимся списком JComboBox. А в третьем столбце используется простенький редактор даты. В качестве компонента для редактирования даты используется счетчик JSpinner со специальной моделью. Редактор DateCellEditor наследует свойства класса AbstractCellEditor и реализует интерфейс TableCellEditor. Необходимо переопределить метод getTableCellEditorComponent(), который возвращает редактируемый компонент, и метод getCellEditorValue(), сообщающий текущее значение в редакторе (ячейке). Для второго редактора с раскрывающимся списком необходимо предварительно создать объект JComboBox и наполнить его элементами, прежде чем передать его в конструктор.

26.Деревья. Модель дерева.

Такие структуры как деревья имеют преимущества как массивов, так и списков. Вставка и удаление в деревьях так же быстро как и в списках, а поиск работает как в массивах. Поэтому деревья заслужили уважение и широкое применение в информационных системах. Дерево — одна из самых распространенных структур данных в программировании. Оно представляет собой древовидную структуру в виде корня и связанных узлов, соединенных ребрами. Рисунок выше — пример дерева. Ребра это отношения между узлами. А если мы говорим на языке java — то ссылки. Узлы — это сущности или ближе к нашей теме — объекты. Чтобы не плодить кучу слов с теорией я представлю Вам картинку с книги: Роберта Лафоре «Структуры данных и алгоритмы», которая наглядно демонстрирует всю сущность деревьев. В программировании, когда говорят о деревьях, то часто имеют ввиду именно двоичные деревья. Это те, в которых каждый узел имеет не более двух потомков. Если не понял — смотреть картинку выше. На ней изображено двоичное дерево. С картинки выше видно, что два потомка именуются левым и правым в зависимости от стороны в которой они расположены от родителя. Узлы размещаются в дереве не просто так. Помимо того, что каждый узел хранит данные у него есть ключ. У бинарного дерева ключ левого потомка меньше, чем у родителя, а правого — больше или равно родительскому. При изучении деревьев часто встречается такое понятие как сбалансированность дерева. Дерево считается сбалансированным если имеет примерно одинаковое количество элементов относительно корня. Тоже самое касается и поддерева. На рисунке ниже представлен пример несбалансированного дерева. Если дерево сбалансировано, операции с ним буду выполняться быстрее. Теперь давайте попробуем сами написать реализацию этой замечательной структуры данных. Тем более, что на собеседованиях очень часто просят это сделать. Да и знать как это делается для себя будет очень полезно. Для начала нужно определить, что мы будем хранить в узлах нашего дерева. В идеале — это должен быть дженерик (generics) или ссылка на некий объект, но для упрощения реализации ограничимся строковой переменной. Код 1.public class Node { 2. 3public int key; //ключ узла 4.public String data; //некоторые данные в узле 5.public Node leftChild; //левый потомок 6.public Node rightChild; //правый потомок 7 8/** 9.* Метод который выводит на экран содержимое узла 10*/ 11.public void printNode(){ 12 System.out.println(«KEY » + key + » DATA: » + data); 13} 14} Код выше очень простой. Он отражает все, что мы узнали об узлах. Теперь осталось создать класс, который будет представлять дерево. В нем будут методы поиска, вставки и вывода всех элементов в списке.

27.Работа с выделением в дереве.

Отображение иерархической информации в библиотеке Swing реализуется с помощью дерева JTree, основой которого является корневой узел root. Потомки корневого узла, могут иметь своих потомков, и т.д. Информация о ветвях дерева хранится в узлах nodes. Узел без потомков является листом leaf дерева. Потомки одного узла являются близнецамиsiblings. Путь path в дереве определяет последовательность узлов, начиная от корня, по которым следует пройти, чтобы найти нужный нам узел. Пакет javax.swing.tree хранит основные «строительные» классы деревьев Swing : интерфейс TreeNode, описывающий узел дерева, модель дерева с его данными, реализующую интерфейс TreeModel, модель выделения узлов дереваTreeSelectionModel, позволяющую настраивать различные режимы выделения, класс TreePath, описывающий путь в дереве. Информация о выделенных узлах дерева хранится в специальной модели, реализующая интерфейс TreeSelectionModel. Данная модель позволяет выделить один узел, несколько смежных узлов или несколько несмежных узлов. В дереве с его иерархической структурой нельзя использовать индексы для управления выделенными узлами. Для определения местоположения узла в дереве TreeSelectionModel использует два способа. В первую очередь, это путь TreePath, включающий наборы узлов, перемещаясь по которым от корня можно достигнуть требуемого узла. Во-вторых, это номер строки в дереве. Второй способ для одного и того же выделения возвращает разные значения в зависимости от раскрытия или свертывания предков. Основные две группы методов модели выделения TreeSelectionModel включают методы вида addSelectionPath(s), которые добавляют к уже имеющемуся выделению новый узел с заданным путем TreePath, и методы вида setSelectionPath(s), которые заменяют текущее выделение новым, также с заданным путем TreePath. Именно эти методы выполняют основную работу. К примеру, если TreeSelectionModel работает в режиме выделения только одного узла, то при вызове метода addSelectionPath() модель снимает имеющееся выделение и добавляет новый выделенный узел. Если бы поддерживался режим произвольного выделения, то данный метод просто добавлял новые узлы к имеющимся. Это же относится и к методам setSelectionPath(s), который последний выделенный в дереве узел отмечает моделью выделения особым образом. Этот узел можно получить методом getLeadSelectionPath(). TreeSelectionModel поддерживает слушателей TreeSelectionListener, которые оповещаются при изменении выделенных узлов дерева. Как правило, в дереве по умолчанию используется стандартная модель выделения DefaultTreeSelectionModel. Присоединить слушателя TreeSelectionListener можно как к модели выделения, так и к самому дереву JTree. Различие связано с тем, что будет возвращать метод getSource(). В первом случае он вернет ссылку на модель выделения, в которой произошло изменение, а во втором — ссылку на само дерево. В классе JTree дублируются все методы модели выделения. Они просто делегируют ей свои вызовы. Кроме этого, в классе JTree есть несколько весьма полезных методов, способных упростить работу с выделенными узлами. Поэтому лучше присоединять слушателя непосредственно к дереву. Методы работы с выделениями Метод Описание addSelectionPath(s), addSelectionRow(s) Методы принадлежат модели TreeSelectionModel и позволяют программно прибавлять к выделенным узлам новые. setSelectionPath(s), setSelectionRow(s) Методы принадлежат модели TreeSelectionModel и позволяют программно устанавливать выделения узлов. clearSelection() Очистка всех выделенных узлов дерева. getMinSelectionRow() Метод получения номера первого выделенного узла (строки). getMaxSelectionRow() Метод получения номера последнего выделенного узла (строки). isPathSelected(), isRowSelected() Методы получения выделенных узлов дерева.

или напишите нам прямо сейчас

Написать в WhatsApp Написать в Telegram

О сайте
Ссылка на первоисточник:
http://bgarf.ru/
Поделитесь в соцсетях:

Оставить комментарий

Inna Petrova 18 минут назад

Нужно пройти преддипломную практику у нескольких предметов написать введение и отчет по практике так де сдать 4 экзамена после практики

Иван, помощь с обучением 25 минут назад

Inna Petrova, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Коля 2 часа назад

Здравствуйте, сколько будет стоить данная работа и как заказать?

Иван, помощь с обучением 2 часа назад

Николай, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Инкогнито 5 часов назад

Сделать презентацию и защитную речь к дипломной работе по теме: Источники права социального обеспечения. Сам диплом готов, пришлю его Вам по запросу!

Иван, помощь с обучением 6 часов назад

Здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Василий 12 часов назад

Здравствуйте. ищу экзаменационные билеты с ответами для прохождения вступительного теста по теме Общая социальная психология на магистратуру в Московский институт психоанализа.

Иван, помощь с обучением 12 часов назад

Василий, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Анна Михайловна 1 день назад

Нужно закрыть предмет «Микроэкономика» за сколько времени и за какую цену сделаете?

Иван, помощь с обучением 1 день назад

Анна Михайловна, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Сергей 1 день назад

Здравствуйте. Нужен отчёт о прохождении практики, специальность Государственное и муниципальное управление. Планирую пройти практику в школе там, где работаю.

Иван, помощь с обучением 1 день назад

Сергей, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Инна 1 день назад

Добрый день! Учусь на 2 курсе по специальности земельно-имущественные отношения. Нужен отчет по учебной практике. Подскажите, пожалуйста, стоимость и сроки выполнения?

Иван, помощь с обучением 1 день назад

Инна, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Студент 2 дня назад

Здравствуйте, у меня сегодня начинается сессия, нужно будет ответить на вопросы по русскому и математике за определенное время онлайн. Сможете помочь? И сколько это будет стоить? Колледж КЭСИ, первый курс.

Иван, помощь с обучением 2 дня назад

Здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Ольга 2 дня назад

Требуется сделать практические задания по математике 40.02.01 Право и организация социального обеспечения семестр 2

Иван, помощь с обучением 2 дня назад

Ольга, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Вика 3 дня назад

сдача сессии по следующим предметам: Этика деловых отношений - Калашников В.Г. Управление соц. развитием организации- Пересада А. В. Документационное обеспечение управления - Рафикова В.М. Управление производительностью труда- Фаизова Э. Ф. Кадровый аудит- Рафикова В. М. Персональный брендинг - Фаизова Э. Ф. Эргономика труда- Калашников В. Г.

Иван, помощь с обучением 3 дня назад

Вика, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Игорь Валерьевич 3 дня назад

здравствуйте. помогите пройти итоговый тест по теме Обновление содержания образования: изменения организации и осуществления образовательной деятельности в соответствии с ФГОС НОО

Иван, помощь с обучением 3 дня назад

Игорь Валерьевич, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Вадим 4 дня назад

Пройти 7 тестов в личном кабинете. Сооружения и эксплуатация газонефтипровод и хранилищ

Иван, помощь с обучением 4 дня назад

Вадим, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Кирилл 4 дня назад

Здравствуйте! Нашел у вас на сайте задачу, какая мне необходима, можно узнать стоимость?

Иван, помощь с обучением 4 дня назад

Кирилл, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Oleg 4 дня назад

Требуется пройти задания первый семестр Специальность: 10.02.01 Организация и технология защиты информации. Химия сдана, история тоже. Сколько это будет стоить в комплексе и попредметно и сколько на это понадобится времени?

Иван, помощь с обучением 4 дня назад

Oleg, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Валерия 5 дней назад

ЗДРАВСТВУЙТЕ. СКАЖИТЕ МОЖЕТЕ ЛИ ВЫ ПОМОЧЬ С ВЫПОЛНЕНИЕМ практики и ВКР по банку ВТБ. ответьте пожалуйста если можно побыстрее , а то просто уже вся на нервяке из-за этой учебы. и сколько это будет стоить?

Иван, помощь с обучением 5 дней назад

Валерия, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Инкогнито 5 дней назад

Здравствуйте. Нужны ответы на вопросы для экзамена. Направление - Пожарная безопасность.

Иван, помощь с обучением 5 дней назад

Здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Иван неделю назад

Защита дипломной дистанционно, "Синергия", Направленность (профиль) Информационные системы и технологии, Бакалавр, тема: «Автоматизация приема и анализа заявок технической поддержки

Иван, помощь с обучением неделю назад

Иван, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru

Дарья неделю назад

Необходимо написать дипломную работу на тему: «Разработка проекта внедрения CRM-системы. + презентацию (слайды) для предзащиты ВКР. Презентация должна быть в формате PDF или формате файлов PowerPoint! Институт ТГУ Росдистант. Предыдущий исполнитель написал ВКР, но работа не прошла по антиплагиату. Предыдущий исполнитель пропал и не отвечает. Есть его работа, которую нужно исправить, либо переписать с нуля.

Иван, помощь с обучением неделю назад

Дарья, здравствуйте! Мы можем Вам помочь. Прошу Вас прислать всю необходимую информацию на почту и написать что необходимо выполнить. Я посмотрю описание к заданиям и напишу Вам стоимость и срок выполнения. Информацию нужно прислать на почту info@the-distance.ru