Java. Swing. Кнопки. Списки. Таблицы

Прикладное программирование Программирование на Java Java. Swing. Кнопки. Списки. Таблицы

  • В этой теме 0 ответов, 1 участник, последнее обновление 1 год, 5 месяцев назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #5243
      @admin

      Кнопки

      Работа с кнопками осуществляется потомками класса AbstractButton:

      • JButton — обычная командная кнопка;
      • JCheckBox — кнопка флажок;
      • JRadioButton — радио кнопка. Для логической группировки этих кнопок служит объект класса ButtonGroup.

      В большинстве случаев в конструкторе кнопки указывается командная строка. Она же по умолчанию является текстом кнопки. Изменить и получить командную строку можно
      методами setActionCommand и getActionCommand. Изменить и получить текст кнопки можно методами setText и getText.

      Кнопкам можно назначить быструю клавишу:
      mybutton.setMnemonic(KeyEvent.VK_F); // ALT+F

      Обработка нажатия осуществляется через интерфейс ActionListener. Дополнительно для
      кнопки флажка можно обрабатывать событие изменение состояния через интерфейс ItemListener.

      Также предусмотрены методы для назначения изображений на различные состояния кнопки, например setPressedIcon.

      Ниже приведен пример окна с тремя видами кнопок. При нажатии на любой кнопке в консоль выводится ее командная строка. А при нажатии кнопки «Ок» дополнительно выводятся текущие состояния остальных кнопок.

      import java.awt.BorderLayout;
      import java.awt.GridLayout;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import java.awt.event.KeyEvent;
      import java.util.Enumeration;
      
      import javax.swing.AbstractButton;
      import javax.swing.ButtonGroup;
      import javax.swing.JButton;
      import javax.swing.JCheckBox;
      import javax.swing.JPanel;
      import javax.swing.JRadioButton;
      
      public class MyPanel extends JPanel implements ActionListener{
      
          private static final long serialVersionUID = 1L;
          private JCheckBox chk = new JCheckBox("flag", false);
          private JButton bt = new JButton("Ok");
          // логическая группа кнопок
          private ButtonGroup group = new ButtonGroup(); 
      
          public MyPanel() {
              setLayout(new BorderLayout());
              
              // -------------------------------------
              // создание радиокнопок
              JPanel jp = new JPanel(new GridLayout(0, 1)); // панель для кнопок
              JRadioButton rb = null; // временная переменная для радиокнопок
      
              rb = new JRadioButton("radio1");
              group.add(rb); // добавляем ее в группу
              jp.add(rb); // добавляем ее в панель
      
              rb = new JRadioButton("radio2", true); // выбранная по умолчанию
              group.add(rb);
              jp.add(rb);
      
              rb = new JRadioButton("radio3");
              group.add(rb);
              jp.add(rb);
      
              // ------------------------------------
              // добавление кнопок на панель
              add(chk, BorderLayout.NORTH);
              add(jp);
              add(bt, BorderLayout.SOUTH);
      
              // -------------------------------------
              // добавление обработчиков действия
              bt.addActionListener(this);
              chk.addActionListener(this);
              for (Enumeration<AbstractButton> e = group.getElements(); e
                      .hasMoreElements();) {
                  e.nextElement().addActionListener(this);
              }
      
              // ------------------------------
              // добавляем быструю клавишу
              chk.setMnemonic(KeyEvent.VK_F); // ALT+F
              bt.setMnemonic(KeyEvent.VK_ENTER); // ALT+Enter
          }
          
          @Override
          public void actionPerformed(ActionEvent e) {
              AbstractButton a;
              System.out.println(e.getActionCommand());
      
              // если Ок то выводим доп. инфу по другим кнопкам
              if (e.getSource().equals(bt)) {
                  System.out.println("flag state: " + chk.isSelected());
                  for (Enumeration<AbstractButton> rb = group.getElements(); rb
                          .hasMoreElements();) {
                      a = rb.nextElement();
                      System.out.println("radio " + a.getActionCommand() + "state: "
                              + a.isSelected());
                  }
              }
          }
      }

      Списки

      Для работы со списками по необходимости используются следующие классы:

      • JList — визуальный компонент отображения списка. Массив элементов можно указать при инициализации или методом setListData;
      • DefaultListModel — класс по управлению данными списка. Если необходимо добавление/удаление одиночных элементов в режиме реального времени, то объект этого типа необходимо создавать явно (чтобы иметь к нему доступ);
      • ListCellRenderer — интерфейс для пользовательского отображения элементов списка. По умолчанию элемент списка отображается в виде текста. Если объект представляющий элемент не является строкой, то используется метод toString.

      настройка списка

      • setLayoutOrientation — определяет порядок отображения элементов
        • VERTICAL — по вертикали в один столбец;
        • HORIZONTAL_WRAP — горизонтали в несколько строк;
        • VERTICAL_WRAP — по вертикали в несколько столбцов.
      • setVisibleRowCount — определяет желательное число отображаемых строк,
        значение -1 указывает максимальное число строк;
      • setPrototypeCellValue — устанавливает объект, чьи размеры будут шаблоном для всех элементов. Это позволяет ускорить отрисовку списка (доп. см. методы setFixedCellWidth и setFixedCellHeight).

      выделение элементов

      • addListSelectionListener — добавить обработчик на выделение элемента;
      • getSelectedIndex — получить индекс первого выделенного элемента;
      • getSelectedIndices — получить индексы выделенных элементов;
      • getSelectedValue — получить выделенный элемент(ы);
      • setSelectedIndex — выделеить указанный элемент;
      • setSelectedIndices — выделить указанные элементы;
      • setSelectedValue — выделить указанный объект;
      • addSelectionInterval — добавить интервал элементов к текущему выделению;
      • isSelectedIndex — выделен ли указанный элемент;
      • isSelectionEmpty — истина, если выделенных элементов нет;
      • clearSelection — снять выделение.

      внутренняя структура списка

      • setModel/getModel — определяют текущую модель управления элементами. Сама модель описывается интерфейсом ListModel (реализован в классе DefaultListModel);
      • setSelectionModel/getSelectionModel — определяют текущую модель выбора элементов. Сама модель описывается интерфейсом ListSelectionModel (реализован в
        классе DefaultListSelectionModel);
      • setCellRenderer/getCellRenderer — определяют текущий отрисовщик элемента.
        Сам отрисовщик описывается интерфейсом ListCellRenderer (реализован в классе
        DefaultListCellRenderer и других).

      список флажков

      Ниже приведен пример как, заменяя отрисовщик (ChkRender), получить новый элемент управления. В данном случае список кнопок флажков (чекбоксы).

      //-------------------------------------------------------
      // класс для элемента списка
      public class ChkObj {
      
          public boolean flag = false;
          public final String txt;
      
          ChkObj(String ttxt) {
              txt = ttxt;
          }
      
          ChkObj(String ttxt, boolean fflag) {
              txt = ttxt;
              flag = fflag;
          }
      
          @Override
          public String toString() {
              return txt;
          }
      }
      
      //-------------------------------------------------------
      // отрисовщик элементов списка основанный на JCheckBox
      // (встроенный отрисовщик использует JLabel) 
      import java.awt.Color;
      import java.awt.Component;
      
      import javax.swing.JCheckBox;
      import javax.swing.JList;
      import javax.swing.ListCellRenderer;
      
      public class ChkRender extends JCheckBox 
          implements ListCellRenderer {
      
          @Override
          public Component getListCellRendererComponent(JList arg0, Object obj,
                  int ind, boolean isSelected, boolean cellHasFocus) {
      
              setText(obj.toString());
              setSelected(((ChkObj) obj).flag);
      
              if (isSelected) {
                  if (cellHasFocus) {
                      setBackground(Color.CYAN);
                  } else {
                      setBackground(Color.RED);
                  }
              } else {
                  if (cellHasFocus) {
                      setBackground(Color.GREEN);
                  } else {
                      setBackground(Color.WHITE);
                  }
              }        
              return this;
          }
      }
      
      //------------------------------------------
      // демонстрационная панель
      import java.awt.BorderLayout;
      import java.awt.event.MouseAdapter;
      import java.awt.event.MouseEvent;
      
      import javax.swing.JList;
      import javax.swing.JPanel;
      import javax.swing.JScrollPane;
      
      public class MyPanel extends JPanel{
      
          private static final long serialVersionUID = 1L;
          private ChkObj itms[] = new ChkObj[] { new ChkObj("one", true), 
                  new ChkObj("two"), new ChkObj("three"), 
                  new ChkObj("four"), new ChkObj("five", true),
                  new ChkObj("six", true)    };
          private JList lst = new JList(itms);
      
          public MyPanel() {
              setLayout(new BorderLayout());
              
              // добавление списка с прокруткой
              add(new JScrollPane(lst));
              
              // если закомментировать будет обычный список
              lst.setCellRenderer(new ChkRender());
              
              // обработчик двойного клика через адаптер
              lst.addMouseListener(new MouseAdapter(){
                  public void mouseClicked(MouseEvent e) { 
                      ChkObj tmp = null;
                      if (e.getClickCount() == 2) {
                          tmp = ((ChkObj) lst.getSelectedValue());
                          tmp.flag = !tmp.flag;
                          lst.repaint();
                  }}});        
          }
      }

      Таблицы

      Таблица описывается классом JTable.

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

      import java.awt.Color;
      import javax.swing.JPanel;
      import javax.swing.JScrollPane;
      import javax.swing.JTable;
      
      public class MyPanel extends JPanel {
      
          private static final long serialVersionUID = 1L;
          private Object[][] tbldata = {
                  { "Red", new Integer(255), new Integer(0), new Integer(0) },
                  { "Green", new Integer(0), new Integer(255), new Integer(0) },
                  { "Blue", new Integer(0), new Integer(0), new Integer(255) } };
          private String[] tblheader = { "Color name", "Red", "Green", "Blue" };
          private JTable tbl = new JTable(tbldata, tblheader);
      
          public MyPanel() {
              add(new JScrollPane(tbl));
              tbl.setFillsViewportHeight(true);
              tbl.setGridColor(Color.GREEN);
              tbl.setAutoCreateRowSorter(true);
          }
      }

      сетка

      • getGridColor() — цвет сетки;
      • setGridColor(Color c) — установить цвет сетки;
      • setShowGrid(boolean a) — включает/выключает отображение сетки вокруг ячеек;
      • setShowHorizontalLines(boolean a) — включает/выключает отображение горизонтальных линий сетки;
      • setShowVerticalLines(boolean a) — включает/выключает отображение вертикальных линий сетки;
      • getShowHorizontalLines() — определяет, выводятся ли горизонтальные линии между ячейками;
      • getShowVerticalLines() — определяет, выводятся ли вертикальные линии между
        ячейками.

      обработка события выделения

      Работа с выделением в JTable осуществляется двумя объектами c интерфейсом ListSelectionModel. Первый управляет выделенными строками, он доступен через метод getSelectionModel. Второй управляет выделенными столбцами. Он входит в состав объекта управления столбцами, и доступен через вызов
      getColumnModel().getSelectionModel().

      В качестве обработчиков выделения строк и столбцов используются объекты с интерфейсами ListSelectionListener и TableColumnModelListener соответственно.

      Ниже приведен переделанный предыдущий пример для демонстрации обработки событий выделения строки и столбца.

      public class MyPanel extends JPanel implements ListSelectionListener,
              TableColumnModelListener {
          ...
          private JTable tbl = new JTable(tbldata, tblheader);
      
          public MyPanel() {
          ...
          tbl.getSelectionModel().addListSelectionListener(this);
          tbl.getColumnModel().addColumnModelListener(this);
          }
      
          // получаем объект в текущей выделенной ячейке
          final public Object getSelected() {
              return tbl.getValueAt(tbl.getSelectedRow(), tbl.getSelectedColumn());
          }
      
          @Override
          // событие выделения строки
          public void valueChanged(ListSelectionEvent e) {
              // если событие было сгенерировано нашей таблицей
              if (e.getSource() == tbl.getSelectionModel() && e.getFirstIndex() >= 0) {
                  
                  // отображаем выделенный объект в виде строки
                  System.out.println("selected object: " + getSelected());
              }
          }
      
          @Override
          // событие выделения столбца
          public void columnSelectionChanged(ListSelectionEvent e) {
              // если событие было сгенерировано нашей таблицей
              if (e.getSource() == tbl.getColumnModel().getSelectionModel()
                      && tbl.getSelectedColumn() >= 0 && tbl.getSelectedRow() >= 0) {
                  
                  // отображаем выделенный объект в виде строки
                  System.out.println("selected object: " + getSelected());
              }
          }
      }

      Сам класс JTable также реализует интерфейсы ListSelectionListener и TableColumnModelListener. Таким образом, второй способ обработки событий — создание потомка от JTable с подменой методов valueChanged() и columnSelectionChanged().

      методы JTable связанные с выделением

      • selectAll() — выбрать все;
      • clearSelection() — снять выделение;
      • addColumnSelectionInterval(int fromind, int toind) — добавить указанный промежуток столбцов (включая последний) в текущее выделение;
      • addRowSelectionInterval(int index0, int index1) — добавить указанный промежуток строк (включая последний) в текущее выделение;
      • setColumnSelectionInterval(int fromind, int toind) — выделить столбцы в указанном диапазоне (включительно);
      • setRowSelectionInterval(int fromind, int toind) — выделяет указанный интервал строк (включительно);
      • getSelectedColumn() — индекс первого выделенного столбца или -1;
      • getSelectedColumnCount() — число выделенных столбцов;
      • getSelectedColumns() — массив индексов выделенных столбцов;
      • getSelectedRow() — индекс первой выделенной строки или -1;
      • getSelectedRowCount() — число выделенных строк;
      • getSelectedRows() — массив выделенных строк;
      • isColumnSelected(int col) — выбран ли указанный столбец;
      • isRowSelected(int row) — истина, если указанная строка выбрана;
      • isCellSelected(int row, int col) — выбрана ли указанная ячейка;
      • removeRowSelectionInterval(int fromind, int toind) — снять выделение с указанных строк;
      • removeColumnSelectionInterval(int fromind, int toind) — снять выделение с указанных столбцов;
      • setSelectionMode(int m) — устанавливает режим выделения:
        • ListSelectionModel.SINGLE_SELECTION — однострочный;
        • ListSelectionModel.SINGLE_INTERVAL_SELECTION — один интервал;
        • ListSelectionModel.MULTIPLE_INTERVAL_SELECTION — много интервальный;
      • setCellSelectionEnabled(boolean a) — включить/выключить выбор ячеек;
      • setColumnSelectionAllowed(boolean a) — включить/выключить выбор столбцов;
      • setRowSelectionAllowed(boolean a) — включить/выключить выбор строк;
      • getCellSelectionEnabled() — истина если можно выбирать ячейки (т.е. выбирать строки и столбцы);
      • getColumnSelectionAllowed() — истина, если столбцы можно выбрать;
      • getRowSelectionAllowed() — определяет, можно ли выбирать строки;
      • getSelectionBackground() — цвет заднего фона выделенной ячейки;
      • getSelectionForeground() — цвет переднего фона выделенной ячейки;
      • setSelectionBackground(Color c) — устанавливает цвет заднего фона для выделенных ячеек;
      • setSelectionForeground(Color c) — устанавливает цвет переднего фона для выделенных ячеек;
      • setSelectionModel(ListSelectionModel m) — устанавливает новую модель выделения и начинает ее прослушивание;
      • getSelectionModel() — объект с интерфейсом ListSelectionModel, поддерживающий
        состояние выделенных строк;
      • columnSelectionChanged(ListSelectionEvent e) — вызывается после изменения выделенного столбца;
      • valueChanged(ListSelectionEvent e) — вызывается после изменения выделенной строки/строк.

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.