2014-11-06 72 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(和隨後的ComponentsetEnabled方法,但是我很努力地找出哪些代碼可以防止顯示手形光標。任何幫助將非常感激!下面的代碼:

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:對不起,問題是缺乏一些信息:該表不總是填充的ScrollPane因此設置滾動面板的手形光標引起手光標置於行的行其不存在。如果可能的話,手形光標應該只出現在表格的各行上。

回答

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

雖然..

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

嗨安德魯,謝謝你的迴應。 Scrollpane.setCursor確實會成功更改handCursor,但它會更改整個窗格的光標。我只想把手形光標放在jtable的行上,而這些行並不總是足夠大以填滿表格。 – Hungry 2014-11-06 10:54:12

+0

*「我只想把手形光標放在jtable的行上。」*挑剔,挑剔。 ;) – 2014-11-06 10:55:07

+0

對不起!我也試過'scrollPane.getViewport()。getComponent(0).setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));'但它沒有任何影響。 – Hungry 2014-11-06 10:57:42

0

如果你的目的是要disable editing,則可以覆蓋表模型的isCellEditable方法documentation

另外,如果你需要disable row selection,您可以設置rowSelectionAllowedfalse

,你可以添加mouseListener到表中,並覆蓋自定義遊標mouseEnteredmouseExited,這樣

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)); 
     } 

    }); 

你的一個完整的工作示例:

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)); 
      } 
     });