2014-11-06 84 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)); 
      } 
     });