首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用JFormDesigner实现ListSelectionListener?

如何用JFormDesigner实现ListSelectionListener?
EN

Stack Overflow用户
提问于 2011-06-24 10:00:05
回答 1查看 1.5K关注 0票数 1

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

因此,我认为我需要这个按钮作为一个ListSelectionListener,监听JTable的SelectionModel,就像这个Oracle tutorial中描述的那样。

我应该如何在JFormDesigner 5中做到这一点?

似乎我应该将以下代码添加到我的JButton中,但我不知道如何在JFormDesigner中做到这一点。

代码语言:javascript
复制
// 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 )中。

我使用的是:Java5.0.0.1,IntelliJ 10.5,JFormDesigner 1.6.0_24,Mac 10.6.7。

-已解决

感谢“气垫船上满是黄鱼”回答了我的问题。

解决方案:我将在JFrame中添加代码来创建一个ListSelectionListener。这样就可以在不干扰JFormDesigner工具的情况下完成工作。

我增强了“气垫船满是黄鱼”给出的示例代码,使其更具交互性。我向按钮添加了一个ActionListener,以清除用户的选择。现在,用户可以看到按钮在启用和禁用之间切换。

我的版本显示了一个细微的错误:当表格的选择被清除时,所选的单元格变成黑色。我不知道为什么。但这超出了这个StackOverflow问题的范围。抛开这个bug不谈,这段代码是解决这个问题的一个很好的演示。

代码语言:javascript
复制
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();
         }
      });
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-24 10:51:29

不,JButton本身不应该是ListSelectionListener,而是JTable需要添加一个单独的ListSelectionListener来启用/禁用JButton。不要认为按钮正在监听JTable,因为它不是监听的。相反,一个单独的实体正在监听,并根据是否选中某一行来更改程序的状态。

例如,

代码语言:javascript
复制
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();
         }
      });
   }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6462574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档