java - 如何用JFormDesigner实现ListSelectionListener?

标签 java swing listener jform-designer

我正在尝试获取一个按钮来根据 JTable 是否选择了任何行来启用/禁用自身。

所以我相信我需要将按钮设置为 ListSelectionListener,监听 JTable 的 SelectionModel,如 Oracle tutorial 中所述。 .

我应该如何使用 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 添加 actionPerformed 处理程序的经验,JFormDesigner 在 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();
         }
      });
   }
}

最佳答案

不,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();
         }
      });
   }
}

关于java - 如何用JFormDesigner实现ListSelectionListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6462574/

相关文章:

Java JDesktopPane/JInternalFrame 居中问题

javascript - 重新加载 div 时的事件监听器

java - 在 Java 中使用 10 个线程打印 1 到 100

java - 什么是最好/最优雅的方式来限制并行流中并发评估的数量(比如使用固定线程池)

java - 从另一个类 JFrame 调用重绘

java - JTable 中没有标题

java - 如何捕获JTree节点展开事件

Java:取消按钮不会关闭 JFrame 的窗口

java - 如何正确使用带套接字的 HandlerThread?

java - 我如何断言网页标题的值,其预期值来自selenium中的Excel工作表