2016-10-20 2 views
1

각기 다른 데이터 모델 (예 : 각 테이블의 다른 개체)별로 백업 된 JTable 그룹을 사용하는 응용 프로그램을 개발 중입니다. 유스 케이스에서는 표 집합에 대해 여러 제외 범위가 필요합니다 (즉, 표 그룹 당 최대 1 개의 행을 특정 시점에서 선택할 수 있음).여러 테이블 단일 선택

JDK ButtonGroup은 AbstractButton 그룹에 대해이 기능을 구현합니다. 테이블에 대해 본 적이 있고 비슷한 구현이 있습니까? 그렇지 않다면, 이것을 추구하는 것이 최선의 방법입니까? 아마도 더 나은 디자인 패턴/숙어가있을 것입니다.

+0

난 당신이 직접 코딩해야 할 거라고 생각하고, 당신이 쉽게 알아낼 수 있습니다 내기. –

+0

이 작업을 수행하지는 않았지만 모든 JTable에서 공유하는 사용자 지정 선택 모델을 사용하려고합니다. –

+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); 
       } 
      } 
     } 
    } 
} 
관련 문제