2016-10-20 18 views
1

私は、別々のデータモデル(例えば、各テーブルの異なるオブジェクト)によってバックアップされたJTableのグループを利用するアプリケーションを開発しています。ユースケースでは、テーブルセットに対して複数除外スコープが必要です(つまり、テーブルのグループごとに最大1つの行を任意のポイントで選択できます)。複数テーブル単一選択

JDK ButtonGroupは、AbstractButtonのグループに対してこの機能を実装します。誰も見て、テーブルの類似の実装ですか?そうでない場合、追求するのが最良のアプローチですか?たぶん、より良いデザインパターン/イディオムがあります。

+0

私はあなたがこれを自分でコーディングする必要があるとしていることを考えると、私はあなたがこれを簡単に見つけ出すだろうことを賭けます。 –

+0

私はこれをやっていませんが、おそらくあなたはすべてのJTablesで共有されているカスタム選択モデルを使いたいでしょう。 –

+0

いいえ、カスタム選択モデルではなく、カスタムおよび共有の 'ListSelectionListener'が必要です。 –

答えて

2

自分でロールバックする必要がありますが、これはカスタムListSelectionListenerを使用して行うことができます。これは次のように動作します。

@Override 
public void valueChanged(ListSelectionEvent e) { 
    ListSelectionModel selectedModel = (ListSelectionModel) e.getSource(); 
    for (ListSelectionModel model : models) { 
     if (model != selectedModel) { 
      model.removeListSelectionListener(this); 
      model.clearSelection(); 
      model.addListSelectionListener(this); 
     } 
    } 
} 

modelsは、すべてのJTableのListSelectionModelsを保持するArrayListです。例えば

import java.awt.GridLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 

@SuppressWarnings("serial") 
public class ListSelectionListenerExample extends JPanel { 
    private static final int TABLE_COUNT = 4; 
    private static final Integer[][] DATA = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; 
    private static final String[] COL_NAMES = {"A", "B", "C"}; 

    public ListSelectionListenerExample() { 
     ListSelectionGroup listSelectionGroup = new ListSelectionGroup(); 
     setLayout(new GridLayout(1, 0)); 
     for (int i = 0; i < TABLE_COUNT; i++) { 
      DefaultTableModel model = new DefaultTableModel(DATA, COL_NAMES); 
      JTable table = new JTable(model); 
      ListSelectionModel selectionModel = table.getSelectionModel(); 
      listSelectionGroup.register(selectionModel); 
      add(new JScrollPane(table)); 
     } 
    } 

    private static void createAndShowGui() { 
     ListSelectionListenerExample mainPanel = new ListSelectionListenerExample(); 

     JFrame frame = new JFrame("ListSelectionListener Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

import java.util.ArrayList; 
import java.util.List; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class ListSelectionGroup { 

    private List<ListSelectionModel> models = new ArrayList<>(); 
    private MyListener myListener = new MyListener(); 

    public void register(ListSelectionModel model) { 
     models.add(model); 
     model.addListSelectionListener(myListener); 
    } 

    // overload method for convenience 
    public void register(JTable table) { 
     register(table.getSelectionModel()); 
    } 

    // make a private inner class so that we don't accidentally add this to a 
    // ListSelectionModel without going through the register method 
    private class MyListener implements ListSelectionListener { 

     @Override 
     public void valueChanged(ListSelectionEvent e) { 
      ListSelectionModel selectedModel = (ListSelectionModel) e.getSource(); 
      for (ListSelectionModel model : models) { 
       if (model != selectedModel) { 
        model.removeListSelectionListener(this); 
        model.clearSelection(); 
        model.addListSelectionListener(this); 
       } 
      } 
     } 
    } 
} 
関連する問題