Как реализовать ListSelectionListener с JFormDesigner? - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь получить кнопку для включения / выключения себя в зависимости от того, выбраны ли в JTable какие-либо строки.

Так что я считаю, что мне нужна кнопка ListSelectionListener, прослушивающая SelectionModel JTable, какописанный в этом руководстве по Oracle .

Как мне сделать это с JFormDesigner 5?

Похоже, мне нужно добавить следующий код в мой JButton, но я не знаю, как это сделать в JFormDesigner.

// Implementing this method to be a ListSelectionListener.
public void valueChanged(ListSelectionEvent e) {
    ListSelectionModel lsm = (ListSelectionModel)e.getSource();
    boolean anyRowsSelected = !(lsm.isSelectionEmpty());
    this.setEnabled( anyRowsSelected );
}

По моему опыту с JFormDesigner добавление обработчика actionPerformedJFormDesigner создал метод для JFrame.Но мое понимание Swing & OOP говорит о том, что код для ListSelectionListener должен быть внутри самого прослушивающего виджета (JButton в моем случае).

Я использую: JFormDesigner 5.0.0.1, IntelliJ 10.5, Java 1.6.0_24, Mac OS X 10.6.7.

-------- решено -----------

Благодаря "Hovercraft Full Of Eels" заотвечая на мой вопрос.

Решение: Я добавлю код в мой JFrame для создания ListSelectionListener.Это позволяет выполнить работу, не вмешиваясь в инструмент JFormDesigner.

Я улучшил пример кода, предоставленного "Hovercraft Full Of Eels", чтобы сделать его более интерактивным.Я добавил ActionListener к кнопке, чтобы очистить выбор пользователя.Теперь пользователь может видеть кнопку переключения между включенным и выключенным.

Моя версия показывает небольшую ошибку: выбранная ячейка становится черной, когда выбор таблицы очищается.Я не знаю почему.Но это выходит за рамки этого вопроса StackOverflow.Независимо от этой ошибки, этот код является хорошей демонстрацией для этого вопроса.

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;

public class TableAndButton extends JPanel {
   private static final String[] COLUMN_NAMES = {"Mon", "Tues", "Wed", "Thurs", "Fri"};
   private JButton button = new JButton("Clear user's selection");
   private DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, 10);
   private JTable table = new JTable(model);

   public TableAndButton() {
      JPanel btnPanel = new JPanel();
      btnPanel.add(button);

      table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
         public void valueChanged(ListSelectionEvent e) {
            ListSelectionModel lsm = (ListSelectionModel)e.getSource();
            boolean anyRowSelected = !(lsm.isSelectionEmpty());
            button.setEnabled(anyRowSelected);
         }
      });

      button.addActionListener( new ActionListener() {
          public void actionPerformed(ActionEvent e) {
             table.getSelectionModel().clearSelection();
         }
      });

      button.setEnabled(false);

      setLayout(new BorderLayout());
      add(new JScrollPane(table), BorderLayout.CENTER);
      add(btnPanel, BorderLayout.PAGE_END);
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("TableAndButton");
      frame.getContentPane().add(new TableAndButton());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

1 Ответ

2 голосов
/ 24 июня 2011

Нет, сам JButton не должен быть ListSelectionListener, а JTable требуется отдельный ListSelectionListener, добавленный к нему, который включает / отключает JButton.Не думайте об этом, как будто кнопка слушает JTable, потому что это не так.Вместо этого отдельный объект выполняет прослушивание и изменяет состояние программы в зависимости от того, выбрана ли строка.

например,

import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;

public class TableAndButton extends JPanel {
   private static final String[] COLUMN_NAMES = {"Mon", "Tues", "Wed", "Thurs", "Fri"};
   private JButton button = new JButton("Button");
   private DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, 10);
   private JTable table = new JTable(model);

   public TableAndButton() {
      JPanel btnPanel = new JPanel();
      btnPanel.add(button);

      table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
         public void valueChanged(ListSelectionEvent e) {
            ListSelectionModel lsm = (ListSelectionModel)e.getSource();
            boolean anyRowSelected = !(lsm.isSelectionEmpty());
            button.setEnabled(anyRowSelected);
         }
      });

      button.setEnabled(false);

      setLayout(new BorderLayout());
      add(new JScrollPane(table), BorderLayout.CENTER);
      add(btnPanel, BorderLayout.PAGE_END);
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("TableAndButton");
      frame.getContentPane().add(new TableAndButton());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
...