2014-11-06 2 views
1

JScrollPane 내에서 JTable이 있는데, enabled(false)을 사용하지 못하도록 설정되어 있지만 롤오버에서 손 모양 커서로 변경하고 싶습니다. 나는 단순히 수동으로 테이블의 커서를 설정 시도 :비활성화 된 손 모양 커서 JTable

table.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 

그리고 JTable의의 getCursor() 메소드를 재정의하는 시도 :

JTable table = new JTable(tableModel){ 
    @Override 
    public Cursor getCursor() { 
     return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); //DOESNT WORK 
    } 
}; 

도 기술은 작동하지만. 한 가지 접근법은 전체 테이블에 mouseMotionListener을 추가하는 것입니다. 그러나이 문제는 실제 응용 프로그램에서 테이블에있는 단추를 누르면 'JOptionpane'이 표시됩니다. 사용자가 커서를 테이블 밖으로 이동하고 'JOptionPane'을 닫으면 버그가 발생할 수 있습니다. 물론 'MouseMotionListener'는 과도한 ..?

메서드를 JTable (그리고 그 이후는 Component)으로 재정의하는 방법을 살펴 보았지만 손 모양 커서가 표시되지 않도록하는 코드를 찾으려고 고심하고 있습니다. 어떤 도움을 많이 주시면 감사하겠습니다! 아래 코드 :

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class TableCursorTest { 
    public TableCursorTest(){ 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(new GridBagLayout()); 
     GridBagConstraints constraints = new GridBagConstraints(); 
     String[] headers = {"Items"}; 
     Object[][] data = new Object[][]{{"item 1"},{"item 2"}}; 
     DefaultTableModel tableModel = new DefaultTableModel(data, headers); 

     @SuppressWarnings("serial") 
     @Override 
      public Cursor getCursor() { 
       return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); //DOESNT WORK 
      } 
     }; 

     JScrollPane scrollPane = new JScrollPane(table); 
     table.setEnabled(false); 
     table.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); //DOESNT WORK 


     constraints.gridx = 0; 
     constraints.gridy = 0; 
     constraints.weightx = 0; 
     constraints.weighty = 0; 
     panel.add(scrollPane, constraints); 

     frame.setContentPane(panel); 
     frame.setPreferredSize(new Dimension(500,500)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args){ 
     new TableCursorTest(); 
    } 

} 

UPDATE : 죄송합니다, 질문이 몇 가지 정보를 부족 : 테이블은 항상 스크로 르페 그래서 스크롤의 손 모양 커서를 설정 기입하지 않는 것은하지 않는 선 행을 통해 손 커서 발생 있다. 가능한 경우 손 모양 커서는 표의 행 위에 만 나타나야합니다. 당신의 의도가 disable editing에 경우

답변

3
table.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); //DOESNT WORK 

동안 ..

scrollPane.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); //DOES WORK 
+0

안녕하세요, Andrew, 답변 해 주셔서 감사합니다. Scrollpane.setCursor는 handCursor를 성공적으로 변경하지만 커서 전체를 변경합니다. 테이블을 채우기에 충분하지 않은 jtable 행에 대해서만 손 모양 커서를 놓기를 원합니다. – Hungry

+0

* "jtable의 행 위에 손 커서 만 있으면됩니다."* 까다 롭고 까다 롭습니다. ;) –

+0

하하 죄송합니다! 나는 또한 scrollPane.getViewport(). getComponent (0) .setCursor (Cursor.getPredefinedCursor (Cursor.HAND_CURSOR));를 시도했지만 아무런 영향을주지 않는다. – Hungry

0

, 당신은 disable row selection해야하는 경우가 설정할 수 있습니다 documentation

또한 테이블 모델의 isCellEditable 방법을 대체 할 수 있습니다 rowSelectionAllowed ~ false.

그리고 당신이

table.addMouseListener(new MouseAdapter() 
    { 

     @Override 
     public void mouseExited(MouseEvent e) 
     { 
      table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     } 

     @Override 
     public void mouseEntered(MouseEvent e) 
     { 
      table.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
     } 

    }); 

처럼 당신의 전체 작업 예를 들어 사용자 정의 커서에 대한 mouseEnteredmouseExited을 테이블에 mouseListener를 추가하고 재정의 할 수

public class TableCursorTest 
{ 
    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(new GridBagLayout()); 
    GridBagConstraints constraints = new GridBagConstraints(); 
    String[] headers = { "Items" }; 
    Object[][] data = new Object[][] { { "item 1" }, { "item 2" } }; 
    @SuppressWarnings("serial") 
    DefaultTableModel tableModel = new DefaultTableModel(data, headers) 
    { 
     public boolean isCellEditable(int row, int column) 
     { 
      return false; 
     }; 
    }; 

    public TableCursorTest() 
    { 
     final JTable table = new JTable(tableModel); 

     table.addMouseListener(new MouseAdapter() 
     { 

      @Override 
      public void mouseExited(MouseEvent e) 
      { 
       table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) 
      { 
       table.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
      } 

     }); 

     table.setRowSelectionAllowed(false); 

     JScrollPane scrollPane = new JScrollPane(table); 
     // table.setEnabled(false); 
     // scrollPane.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
     // // DOESNT 
     // WORK 

     constraints.gridx = 0; 
     constraints.gridy = 0; 
     constraints.weightx = 0; 
     constraints.weighty = 0; 
     panel.add(scrollPane, constraints); 

     frame.setContentPane(panel); 
     frame.setPreferredSize(new Dimension(500, 500)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new TableCursorTest(); 
      } 
     }); 
    } 
} 
0

이 예제의를 올바르게 작동합니다 (현재 클래스가 Jpanel을 확장하는 경우).

table.addMouseMotionListener(new MouseMotionAdapter() 
    { 
      public void mouseMoved(MouseEvent e) 
      { 
       int row = table.rowAtPoint(e.getPoint()); 
       if (row > -1) 
       { 
       // easiest way: 
        table.clearSelection(); 
        table.setRowSelectionInterval(row, row); 
        setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 

       } 
       else { 
        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
       } 
      } 
     }); 
    table.getTableHeader().addMouseMotionListener(new MouseMotionAdapter() 
    { 
      public void mouseMoved(MouseEvent e) 
      { 
       setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
      } 
     }); 
관련 문제