【问题标题】:Paint a java.awt.Cursor on a java.awt.Graphics在 java.awt.Graphics 上绘制 java.awt.Cursor
【发布时间】:2013-05-03 12:27:44
【问题描述】:

是否有可能以位图图像(例如BufferedImage)或任何可在Graphics2D 上绘制的形式获取标准 AWT Cursor?例如文本光标new Cursor(Cursor.TEXT_CURSOR)

我相信这些光标会根据原生平台而变化,我想将它们合并到一些 Swing 图标中。

【问题讨论】:

  • 不,据我所知这是不可能的。 “我想将它们合并到一些 Swing 图标中。”这会让用户感到困惑,所以我强烈建议不要这样做。事实上,拥有可识别为指针的东西会好得多,同时与系统使用的任何游标都明显不同
  • 你不能使用纯 Java 来做到这一点,但从技术上讲,如果你使用依赖于平台的本机代码,你可以(参见 stackoverflow.com/questions/739870/…)但正如 Andrew 所说,我真的不建议这样做在这种情况下 - 将光标合并到图标中是 UI 灾难的完整秘诀。
  • @AndrewThompson 好吧,我有一个工具栏,其中一些图标对应于该工具使用的光标(例如文本光标、东西向调整大小等)我认为这里几乎没有混淆的风险。许多应用程序都这样做。例如。看看 Photoshop 中的工具栏。

标签: java swing cursor awt graphics2d


【解决方案1】:

即使您使用自己的图标,您也可以显示平台相关的光标,您稍后将在给定的上下文中使用该光标。将鼠标悬停在按钮和相邻面板上以查看效果。使用图标的组件上的工具提示总是一个很好的接触。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2018-12-23
    • 2016-09-25
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多