2013-05-03 22 views
3
畫一幅java.awt.Cursor中

是否有可能得到一個標準的AWT Cursor的保持在一個位圖圖像(例如BufferedImage)或任何形式對Graphics2D上漆?例如,文本光標new Cursor(Cursor.TEXT_CURSOR)在java.awt.Graphics

我相信這些遊標根據本地平臺而改變,我想將它們合併到一些Swing圖標中。

+1

沒有,就我所知,這是不可能的。 *「我想將它們合併到一些Swing圖標中。」*這會讓用戶感到困惑,所以我強烈建議不要這樣做。事實上,擁有可識別爲指針的東西會更好,但與系統使用的任何遊標截然不同。 – 2013-05-03 12:30:39

+1

你不能用純Java來做,但從技術上講,如果你訴諸平臺相關的本地代碼,你可以做到這一點(見http://stackoverflow.com/questions/739870/extract-cursor-image-in-java。)但正如Andrew所說,在這種情況下,我真的會提出反對意見 - 將光標合併到圖標中是UI災難的完整配方。 – berry120 2013-05-03 12:48:28

+0

@AndrewThompson我有一個工具欄,其中一些圖標與工具使用的光標相對應(例如文本光標,東西方調整大小等),我在這裏看到的混淆風險很小。許多應用程序都這樣。例如。看看Photoshop中的工具欄。 – 2013-05-03 14:24:36

回答

3

即使您使用自己的圖標,也可以顯示稍後將在給定上下文中使用的與平臺相關的遊標。將鼠標懸停在按鈕和相鄰的面板上即可看到效果。使用圖標的組件工具提示始終是一個很好的觸摸。

image

import java.awt.Cursor; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import javax.swing.Icon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.border.TitledBorder; 

/** 
* @see http://stackoverflow.com/a/16363072/230513 
*/ 
public class Test { 

    private static class CursorPanel extends JPanel { 

     private static final Icon ICON = UIManager.getIcon("html.pendingImage"); 
     private Cursor cursor; 

     public CursorPanel(final Cursor cursor) { 
      this.cursor = cursor; 
      String name = cursor.getName(); 
      JButton button = new JButton(name, ICON); 
      button.setCursor(cursor); 
      button.setToolTipText(name); 
      this.add(button); 
      final JPanel panel = new JPanel() { 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(200, 125); 
       } 
      }; 
      panel.setCursor(cursor); 
      panel.setBorder(new TitledBorder(name)); 
      this.add(panel); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLayout(new GridLayout(0, 1)); 
     f.add(new CursorPanel(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR))); 
     f.add(new CursorPanel(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR))); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test().display(); 
      } 
     }); 
    } 
} 
相關問題