2012-06-19 3 views
2

기본 구성 요소로 편집 가능한 JTable에 대해 실행 취소 (및 다시 실행) 기능을 구현하려고합니다. JTable에는 SpecifiedJTable이라는 속성을 지정하는 데 필요한 추가 클래스가 있습니다.JTable이 Doubleclicks를 청취하지 않습니다

셀을 두 번 클릭 (즉, 셀을 선택/편집하도록 표시된 순간)하여 셀의 정보와 스택의 좌표를 스택으로 가져 오는 순간을 잡아 내고 싶었습니다.

이것은 최소한 MouseListener ...에 의해 완료되어야합니다. 나는이

class JTableSpecified extends JTable { 
    private static final long serialVersionUID = 1L; 
    private int c; // the currently selected column 
    private int r; // the currently selected row 

    public JTableSpecified(String[][] obj, String[] columnNames) { 
     super(obj, columnNames); // constructs the real table 
     // makes that you can only select one row at a time 
     this.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); 
     // makes that columns are not squeezed 
     this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     // forbids to rearrange the columns 
     getTableHeader().setReorderingAllowed(false); 
     // adds action listener 
     this.getModel().addTableModelListener(new TableModelListener() { 
      public void tableChanged(TableModelEvent e) { 
       r = getSelectedRow(); 
       c = getSelectedColumn(); 
       // get the String at row r and column c 
       String s = (String) getValueAt(r, c); 
       if (jobDisplayed) jobSwitch(c, s); 
       else resSwitch(c, s); 
      } 
     });  
     this.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent e) { 
       if (e.getClickCount() == 2) { 
        System.out.println("test"); 
       } 
      } 
     }); 
    } 
} 

(내 SpecifiedJTable 클래스의 생성자 서) 그러나 어떻게 든 clickCounter가 나던 내가 어떤 대답에 대해 기쁘게 생각과 이상 1

그거 ... 아무것도에 도달하려는 시도 도움. 감사.

+0

, 그 작동합니다. 나는 내 자신의 코드에서 그런 것을 사용한다. 테이블에 등록 된 다른 마우스 리스너가 일부 마우스 이벤트를 소비하여 리스너에게 전달되지 못하게 할 수 있습니다. – Enwired

+2

코드를 수정할 수 있습니까? 방법대로 그것은 컴파일되지 않을 것입니다. 또한 귀하의 답변 덕분에 더 많은 관련 코드를 선호하십시오. [SSCCE] (http://sscce.org/) – Boro

+0

. 이제 확장 된 코드가 문제가됩니다. @ user1442870 당신이 이것을 더 중요하게 생각할 수 있겠습니까? 마우스 이벤트를 소비하는 다른 리스너를 "중지"시키는 것을 염두에두고 있습니까? 적어도 tablemodelListener는 문제가 아닙니다. 난 그것을 비활성화하고 mouseListener 결국 반응하지 않았다. – user1466944

답변

-1

코드의 오류는 첫 번째 클릭이 발생하자마자 mouseClicked 메서드가 호출된다는 것입니다. 두 번 클릭하면 mouseClicked 메서드가 다시 호출됩니다. (e.getWhen() 메소드를 사용하여) 시간을 저장하는 이전의 click 이벤트에 대한 정적 변수 (또는 클래스 변수)를 배치 할 수 있습니다. 시차를 확인하고 충분히 작 으면 작업을 실행하십시오 (doubleClick 메서드를 호출하는 것이 좋습니다).

JTableSpecified 클래스에서 마우스 수신기를 구현해야 할 수도 있습니다. 정적 변수가 기존 코드에 배치되지 않았기 때문입니다.

+0

흠 이건 내 문제에 대한 실제 해결책이 아닌 것 같아./이걸 구현하면 두 개의 다른 셀을 클릭 할 수 있고 카운터가 2에 있기 때문에 해고 될 수도 있기 때문에이 수신기를 각 셀에 넣을 수 있습니다. 이 일을하는 방법이 있습니까? 또는 선택의 순간을 감지하기위한 mouselistener 없이는 더 좋은 방법이있을 수 있습니다. – user1466944

+0

예, getPosition 메소드로 mouseEvent의 위치를 ​​확인할 수 있습니다. 나는 시간차가 500ms로 낮 으면, 클릭 할 수없고, 500ms 이내에 다시 움직이고 클릭하기 때문에 이것이 필요하지 않았다. 하지만 원하는 경우 u는 2 개의 변수를 만들고 두 조건을 모두 확인할 수 있습니다. 결국, 더블 클릭은 마우스를 움직이지 않고 두 번의 연속적인 클릭으로 정의됩니다. – vedant1811

2

발생하는 문제는 을 사용하는 대신 mouseClicked()을 사용하는 것과 관련이 있습니다. 이 경우에는 클릭 수를 늘리는 것이 매우 어려워 보이지만 여전히 가능합니다. 클릭 수를 1보다 늘리려면 많은 클릭과 마우스 움직임이 필요했습니다. 코드에서 직접 시도해보십시오. 카운터가 1 이상이되게하려면 &을 빠르게 눌러 마우스를 움직여야합니다. 동시에 마우스를 셀에서 셀로 이동하면서 (또는 어쩌면 내가 셀 사이를 운 좋게 클릭 했습니까?).

코드로 작성된이 전체 예제에서 볼 수 있듯이 방법을 사용하는 두 번의 마우스 누름이 올바르게 감지되었습니다.

public class JTableSpecified extends JTable { 
    private static final long serialVersionUID = 1L; 

    public JTableSpecified(String[][] obj, String[] columnNames) { 
     super(obj, columnNames); // constructs the real table 
     // makes that you can only select one row at a time 
     this.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); 
     // makes that columns are not squeezed 
     this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     // forbids to rearrange the columns 
     getTableHeader().setReorderingAllowed(false); 
     // adds action listener 
     this.getModel().addTableModelListener(new TableModelListener() { 
      @Override 
      public void tableChanged(TableModelEvent e) { 
      } 
     });   
     this.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mousePressed(MouseEvent e) { 
       if (e.getClickCount() == 2) { 
        System.out.println("test"); 
       } 
       System.out.println("e.getClickCount() = " + e.getClickCount()); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JPanel panel = new JPanel(); 
       panel.add(new JTableSpecified(new String[][]{{"oi", "oi2"}, {"oi3", "oi4"}}, new String[]{"Col1", "Col2"})); 
       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setContentPane(panel); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

결론 :은 어쩌면 당신은 실제로 mousePressed() 방법을 사용하려면?

+0

네, 감사합니다. 보로. =) 정말 mousePressed()와 함께 작동합니다. 나는 그것이 항상 "찾고있는 그런"단순한 "해결책이라는 것을 알기가 꽤 재미있다. 여러 번의 테스트를 거친 후 원치 않는 이벤트없이 응용 프로그램에 완벽한 결과를 제공하는 것으로 보입니다. 고마워요. – user1466944

1

BasicTableUI는 두 번 클릭 한 셀에서 편집 모드로 이동하여 두 번 클릭에 응답합니다. 복잡한 작업을 많이하며, 그 중 일부는 데이터를 편집 할 수 있도록 JTextField (또는 다른 구성 요소)를 만든 다음 마우스 클릭 이벤트가 더 이상 전파되지 못하게합니다.

테이블이나 테이블 셀을 편집 할 수없는 경우에는 클릭 수 2, 3, 4, ...로 마우스 이벤트를 쉽게 캡처 할 수 있습니다. 그러나 테이블을 편집 가능하게 만들기 위해서는 접근.

하나의 아이디어는 JTable을 재정의하는 것입니다. editCellAt()

더 좋은 아이디어는 JTable을 망치는 대신 테이블 모델 자체에서 데이터 변경 사항을 수신하는 것입니다.

1

이 답변은 보로의 대답을 확장합니다.
사용자가 테이블을 편집 할 수있게하는 모든 경우를 포착하려면 F2 키 (키를 두 번 클릭하는 것과 동일한 효과가 있음)에 KeyListener를 추가하고 아무 키나 눌러 자동 셀 편집을 비활성화해야합니다.
난 그냥 ("JTable.autoStartsEdit"는 Boolean.FALSE)를

가 // 핵심
this.putClientProperty를 쳐서 편집을 금지 (위 참조) 바로의 MouseListener 뒤에 생성자에 추가;

// 모든 KeyListener는 F2 (키 코드 113)
this.addKeyListener (새 KeyAdapter() {

공개 무효의 keyPressed (KeyEvent를 전자) {

가압에 반응 할 if (e.getKeyCode() == 113) System.out.println ("test");
}
}}); 일반적으로

+0

+1 나는 그것을 좋아한다. 사람들이 편집을위한 '표준'키인 'F2'로 편집 할 수있게되면 언제나 좋아해요. – Boro

관련 문제