1

JTableで行が選択されているかどうかに応じて、それ自体を有効/無効にするボタンを取得しようとしています。

したがって、このOracleチュートリアルで説明されているように、ボタンをListSelectionListenerにして、JTableのSelectionModelをリッスンする必要があると思います。

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 OSX10.6.7です。

--------解決済み-----------

私の質問に答えてくれた「HovercraftFullOfEels」に感謝します。

解決策:JFrameにコードを追加して、ListSelectionListenerを作成します。これにより、JFormDesignerツールに干渉することなく作業を完了できます。

「HovercraftFullOfEels」のサンプルコードを拡張して、よりインタラクティブにしました。ユーザーの選択をクリアするために、ボタンに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();
         }
      });
   }
}
4

1 に答える 1

2

いいえ、JButton 自体は ListSelectionListener であってはなりません。JTable には、JButton を有効/無効にする別の ListSelectionListener を追加する必要があります。ボタンが 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();
         }
      });
   }
}
于 2011-06-24T02:51:28.690 に答える