Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
|
§ Applet m 107* Button 108 Button ж 127 Button 128 Button 129 Butt Hi 147 Button 148 Button 149 Butt —; N1167 Button 168 Button 169 Bud Hi 187 Button 188 Button 189 Butt ; ^ HI 207 Button 208 Button 209 Butt in 227 Button 228 Button 229 Butt HI 247 Button 248 Button 249 Butt m 2 6 7 Button 268 Button 269 Butt ■v « I . .... I HI.. t - I M [Applet started Рис. 31.8. Окно аплета Класс Базовым классом списков в библиотеке Swing является класс JList. Он поддерживает выбор одного или нескольких элементов из списка. Зачастую список состоит из строк, но можно создать список из любых объектов, которые только можно отобразить. Класс JList настолько часто применяется в Java, что вы уже должны были обязательно с ним встретиться Глава 31. Дополнительные сведения о библиотеке Ранее элементы в объекте класса JList были представлены как ссылки на класс Obj ect. Нос выпуском комплекта 7 класс JList был сделан обобщением и теперь объявляется так Здесь параметр Е представляет тип элементов в списке. Класс JList предлагает несколько конструкторов. Один из наиболее используемых конструкторов выглядит так Е [ ] элементы) Этот конструктор создает список класса JList, содержащий элементы в массиве, определяемые с помощью параметра элементы. Класс JList основан на двух моделях. Первая модель — интерфейс ListModel, который определяет, как осуществляется доступ к данным списка. Второй моделью является интерфейс List Select ionModel, который определяет методы, позволяющие узнать, какой элемент (элементы) списка был выбран. Хотя класс JList способен без проблем работать самостоятельно, обычно его экземпляр вкладывают в контейнер класса JScrollPane. Благодаря этому длинные списки автоматически прокручиваются, что упрощает проектирование графического интерфейса. Это позволит также упростить изменение количества записей в списке, не изменяя его размеры. Класс JList создает извещение о событии ListSelectionEvent, когда пользователь выбирает элемент или изменяет выбор элемента. Это событие происходит также тогда, когда пользователь отменяет выбор элемента. Оно обрабатывается слушателем ListSelectionListener, который определяет только один метод — valueChanged (). void v a l u e C h a n g e d ( ListSelectionEvent l e Здесь параметр l e — это ссылка на объект, который создал извещение о событии. Хотя класс события ListSelectionEvent тоже предлагает некоторые методы, вы обычно будете использовать сам объект класса JList, чтобы узнать, что произошло. Событие ListSelectionEvent и слушатель ListSelectionListener определены в пакете j avax. swing. По умолчанию класс JList позволяет пользователю выбирать несколько диапазонов элементов внутри списка, однако вы можете изменить это поведение, вызвав метод set Select ionModel () , который определен в классе JList. Он показан ниже s e t S e l e c t i o n M o d e (int режим) Здесь режим — это режим выбора. Он должен быть представлен одним из следующих значений, определенных интерфейсом List Select ionModel. SINGLE_SELECTION S I N G LE_INTERVAL_SELECTION MULTIPLE_I N T E R V A L _ S E L E C T I O По умолчанию используется последнее значение, которое позволяет пользователю выбирать множество диапазонов элементов внутри списка. Если будет задан выбор в единичном интервале (SINGLE_INTERVAL_SELECTION), пользователь сможет выбрать только один диапазон элементов. Если будет выбрано значение SINGLE_SELECTION, пользователь сможет выбрать только один элемент. Естественно, один элемент можно выбрать ив двух других режимах. Просто эти режимы позволяют также выбирать диапазон элементов. Вы можете получить индекс первого выбранного элемента, который будет также являться индексом единственного выбранного элемента в режиме SINGLE_ SELECTION, если вызовете метод getSelectedlndex () , показанный ниже getSelectedlndex() 9 9 2 Часть III. Разработка программного обеспечения с использованием Индексация начинается с нуля. Поэтому если будет выбран первый элемент, метод вернет значение 0. Если не будет выбрано ни одного элемента, будет возвращено значение Вместо того чтобы получать индекс выбранного элемента, вы можете получить значение, связанное с выбранным элементом, вызвав метод get Select edValue (). Е Метод возвращает ссылку на первое выбранное значение. Если не будет выбрано ни одного значения, он вернет значение На примере следующего аплета демонстрируется использование простого списка класса JList, хранящего перечень городов. Каждый раз, когда пользователь выбирает город в списке, происходит событие ListSelectionEvent, обработкой которого занимается метод valueChanged () , определенный в слушателе ListSelectionListener. Он получает индекс выбранного элемента и отображает имя выбранного города в метке Демонстрация применения JList. import javax.swing.*; import javax.swing.event.*; import j a v a .a w t .*; import j a v a .a w t .event.*; /* */ public class JListDemo extends JApplet { JList JLabel jlab; JScrollPane jscrlp; // Создаем массив городов Cities[] = { "New York", "Chicago", "Houston", "Denver", "Los Angeles", "Seattle", "London", "Paris", "New Delhi", "Hong Kon g ", "Tokyo", "Sydney" }; public void ini t () { try { SwingUtilities.invokeAndWait( new Runnable() { public void r u n () { m ak e G U I (); } } ) ; } catch (Exception exc) { System.out.println("Can't create because of " + exc); // Невозможно создать из-за " + exc); } } private void mak e G U I () { // Изменение компоновки потока setLayout(new FlowLayout()); // Создаем список JList. jlst = new J L i s t < S t n n g > (Cities) ; // Присваиваем режиму выбора значение SINGLE_SELECTION. j1st.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); Глава 31. Дополнительные сведения о библиотеке Swing 9 9 3 // Добавляем список в панель с полосами прокрутки jscrip = new JScrollPane(j1st); // Задаем предпочтительные размеры панели с полосами прокрутки jscrip.setPreferredSize(new Dimension(120, 90)); // Создаем метку, в которой будет отображаться выбранный город jlab = new JLab e l ("Choose a City"); // jlab = new J L Выберите город Добавляем слушатель события выбора для списка j1 s t .addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent le) { // Получаем индекс измененного элемента int idx = j1st.getSelectedlndex(); // Отображаем выбор, если элемент был выбран i f (idx != -1) jlab.setText("Current selection: " + Cities[idx]); // Текущий выбор " + Citi e s [idx]); else // В противном случае повторно предлагаем выбрать // город jlab.setText("Choose a City"); // Выберите город) ; // Добавляем список и метку в панель содержимого a d d (j scrip); a d d (Результат выполнения этого аплета показан на рис. 31.9. Paris _ New Delhi = Hong Kong — Current selection: London A pplet Рис. 31.9. Окно аплета С помощью класса JComboBox библиотеки Swing определяется компонент, называемый комбинированным списком (комбинация текстового поля и раскрывающегося списка. Как правило, комбинированный список отображает одну запись, но он будет также отображать и раскрывающийся список, позволяющий выбирать другие элементы. Вы можете создать комбинированный список, который позволит вводить выбираемый элемент в текстовом поле. Applet Класс JComboBox 32 Зак 3030 9 9 4 Часть III. Разработка программного обеспечения с использованием Ранее элементы в объекте класса JComboBox были представлены как ссылки на класс Object. Нос выпуском JDK 7 класс JComboBox был сделан обобщением и теперь объявляется так Здесь параметр Е представляет тип элементов в раскрывающемся списке. Ниже показан конструктор класса JComboBox, используемый в этом примере (Е [ ] элементы) Здесь элементы — это массив, инициализирующий комбинированный список. Кроме него, доступны также и другие конструкторы. Класс JComboBox использует модель ComboBoxModel. Изменяемые комбинированные списки (списки, элементы которых могут изменяться) используют модель Кроме передачи массива элементов, которые должны быть отображены в раскрывающемся списке, элементы можно добавлять динамически в список при помощи метода addltem () , показанного ниже Е объект) Здесь объект — это объект, который необходимо добавить в комбинированный список. Этот метод должен использоваться только в изменяемых комбинированных списках. Класс JComboBox создает извещение о событии действия, когда пользователь выбирает элемент из списка. Класс JComboBox также создает извещение особы тии элемента, когда изменяется состояние выбора, что происходит при выборе или отмене выбора элемента. Таким образом, при изменении выбора происходит два события одно — для элемента, выбор которого был отменена другое — для выбранного элемента. Нередко оказывается достаточно простого прослушивания событий действия, однако использовать можно оба типа событий. Узнать, какой элемент списка был выбран, можно с помощью метода get Selectedltem(). Object Вам нужно будет привести возвращенное значение к типу объекта, хранящегося в списке. На примере следующего аплета показано использование комбинированного списка. В этом окне содержатся элементы " France", "Germany", " Italy" и "Japan" . Если пользователь выберет государство, произойдет обновление метки, чтобы в ней был отображен флаг данного государства. Обратите внимание на то, насколько мало кода нужно для того, чтобы использовать этот мощный компонент Демонстрация применения JComboBox. import j a v a .a w t .*; import j a v a .a w t .event.*; import j a v a x . s w i n g ; /* */ public class JComboBoxDemo extends JApplet { JLabel jlab; Imagelcon france, germany, italy, japan; JComboBox String flags[] = { "France", "Germany", "Italy", "Japan" }; public void init() { try { SwingUtilities.invokeAndWait( new Runnable() { Глава 31. Дополнительные сведения о библиотеке Swing 9 9 5 public void r u n () { m a k eGUI(); } } ) ; } catch (Exception exc) { System.out.println("Can't create because of " + exc); // Невозможно создать из-за " + exc); } private void m a keGUI() { // Изменение компоновки потока setLayout(new FlowLayout()); // Создание экземпляра комбинированного списка // и добавление его в панель содержимого jcb = new JComboBox add(jcb); // Обработка выбранных элементов ActionListener() { public void actionPerformed(ActionEvent ae) { String s = (String) jcb.getSelectedltem(); jlab.setlcon(new Imagelcon(s + ".gif")); } }) ; // Создание метки и добавление ее в панель содержимого jlab = new JLabel(new с i f ")); На рис. 31.10 показан результат выполнения аплета. Applet Viewer: JComboBoxDemo ||П]|Х| Applet и "; ‘4 Apple j* < ; ,J v'* ^ tif ^ ■/>- Рис. 31.10. Окно аплета JComboBoxDemo Деревья Дерево — это компонент, представляющий иерархический вид данных. В данном представлении пользователь может развертывать или свертывать отдельные узлы. В библиотеке Swing деревья реализуются при помощи класса J T r e e . Ниже показаны некоторые из его конструкторов 9 9 6 Часть III. Разработка программного обеспечения с использованием Java JTree(Object объект ]) JTree(Vector> v) JTree(TreeNode В первом случае дерево создается из элементов массива объект, во втором случае — из элементов вектора (параметр v). В третьем случае дерево определяется корневым узлом, который, в свою очередь, определяется соответствующим параметром (Хотя класс J T r e e входит в состав пакета j a v a x . sw ing, он поддерживает классы и интерфейсы, которые определены в пакете j a v a x . sw in g . t r e e . Это объясняется тем, что количество классов и интерфейсов, необходимых для поддержки класса JT r e e , слишком большое. Класс J T r e e базируется на двух моделях — Т г е еМо de l n T r e e S e l e c t i onMode 1. Этот класс поддерживает разнообразные события, однако применительно к деревьям можно выделить три из них — T re e E x p an sio n E v e n t, T r e e S e le c t io n E v en t и T reeM odelEvent. Событие T re e E x p a n sio n E v e n t происходит при развертывании или свертывании узла, событие T r e e S e le c t io n E v en t — при выборе пользователем или отмене выбора узла в дереве, а событие TreeM odel Event — при изменении данных или структуры дерева. За этими событиями следят слушатели T r e e E x p a n s io n L is te n e r , T r e e S e l e c t i o n L i s t e n e r и T r e e M o d e lL iste n e r соответственно. Классы событий дерева и интерфейсы слушателей определены в пакете j a v a x . sw in g . ev en В примере программы этого раздела обрабатывается событие. Чтобы прослушать это событие, нужно реализовать слушатель T r e e S e l e c t i o n L i s t e n e r . Он определяет только один метод, v alu eC h an ged (), который получает объект класса T r e e S e le c t io n E v e n t . Вы можете получить путь к выбранному объекту, обратившись к методу g e t P ath (). TreePath Метод возвращает объект класса T reeP ath , который описывает путь к измененному узлу. Класс T reeP ath инкапсулирует информацию о пути к определенному узлу в дереве. Он предлагает несколько методов и конструкторов. В этой книге используется только метод t o S t r i n g ( ) . Он возвращает строку, описывающую путь. Интерфейс TreeNode объявляет методы, которые получают информацию об узле дерева. Например, можно получить ссылку на родительский узел или перечень узлов-потомков. Интерфейс расширяет интерфейс TreeNode. Он объявляет методы, которые могут вставлять и удалять узлы-потомки или изменять родительский узел. Класс D efa u ltM u ta b le T re eN o d e реализует интерфейс M utableT reeN ode. Он представляет узел в дереве. Ниже показан один из его конструкторов объект) Здесь объект — это объект, который необходимо заключить в данном узле дерева. Новый узел дерева не имеет родителя или потомка. Чтобы создать иерархию из трех узлов, можно использовать метод add () класса Def a u ltM u tab leT reeN o d e. Ниже показана его сигнатура add(MutableTreeNode потомок) Здесь потомок — это изменяющийся узел дерева, который необходимо добавить в качестве потомка текущего узла. Класс JT r e e сам по себе не предоставляет никаких возможностей для прокрутки. Поэтому экземпляр класса J T r e e обычно помещается внутрь контейнера класса J S c r o ll P a n e . Таким образом, большое дерево можно прокрутить в окне просмотра с меньшими размерами. Ниже перечислены действия, которые необходимо выполнить, чтобы использовать дерево в аплете. Глава 31. Дополнительные сведения о библиотеке Swing 9 9 7 1. Создайте экземпляр класса JT r e e . 2. Создайте экземпляр класса J S c r o l l P a n e и определите дерево в качестве объекта прокрутки. Добавьте дерево в панель с полосами прокрутки. Добавьте панель с полосами прокрутки в панель содержимого. В следующем примере показано, как создается дерево и обрабатывается выбор элементов. Программа создает объект класса D e fa u ltM u ta b leT reeN o d e с заголовком O ptions Параметры. Он является верхним узлом в иерархии дерева. Затем создаются дополнительные узлы дерева и вызывается метод add () для присоединения этих узлов к дереву. Ссылку на верхний узел дерева обеспечивает параметр конструктора класса JT r e e . После этого дерево указывается в качестве параметра конструктора класса J S c r o ll P a n e . Эта панель с полосами прокрутки добавляется в аплет. Затем создается метка и добавляется в панель содержимого Эта метка отображает выбор в дереве. Чтобы получать извещения о событиях при выборе, регистрируется слушатель T r e e S e l e c t i o n L i s t e n e r . Внутри метода v alu eC h an ged () мы получаем и отображаем путь к текущему месту выбора Демонстрация применения JTree. import j a v a .a w t .*; import javax.swing.event.*; import javax.swing.*; |