2011-06-24 5 views
1

JTableに行が選択されているかどうかに応じて、ボタンを有効/無効にしようとしています。JFormDesignerでListSelectionListenerを実装する方法は?

このOracle tutorialに記載されているように、JTableのSelectionModelをリッスンしてListSelectionListenerにする必要があると思います。

JFormDesigner 5ではどうすればよいですか?

私のJButtonに次のコードを追加する必要があるようですが、JFormDesignerでこれを行う方法はわかりません。 JFormDesignerがactionPerformedのハンドラを追加すると、私の経験では

// 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はJFrameの上のメソッドを作成しました。しかし、Swing & OOPの私の理解は、ListSelectionListenerのコードはリスニングウィジェット自体(私の場合はJButton)の中にあるべきだと言います。

私は使用しています:JFormDesigner 5.0.0.1、IntelliJ 10.5、Java 1.6.0_24、Mac OS X 10.6.7。

-------- -----------は私の質問に答えるための「うなぎのホバークラフトのフル」へ

感謝を解決しました。

解決策: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(); 
     } 
     }); 
    } 
} 
+0

1+ニース適応。 :) –

答えて

2

いいえ、の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(); 
     } 
     }); 
    } 
} 
関連する問題