7

私は35x40ピクセルを持っています。pngimageSwingアプリケーションでカスタムカーソルとして使用したい。画像には輝きがあるため、アルファ透明度の値が含まれています。問題は、を使用してカスタムカーソルを生成する従来の方法を使用しようとするとToolkit、アルファ透明度の値があるはずの場所に黒いピクセルが表示されることです。

これが私がカーソルに使用している画像です: https ://dl.dropbox.com/u/1186703/cursor.png

これが私のコードです:

public static void main(String[] args) throws IOException {

     new Sandbox().gui();

}
private Cursor cursor;

private Toolkit kit;

private Image cursorImage;

public void gui() {

    kit = Toolkit.getDefaultToolkit();
    cursorImage = kit.createImage(getClass().getResource(
            "/aurora/V1/resources/cursor.png"));

    cursor = Toolkit.getDefaultToolkit().createCustomCursor(
            cursorImage, new Point(0, 0), "CustomCursor");

    setSize(800, 800);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
    setCursor(cursor);
}

現在の結果は次のとおりです。

結果

編集この方法はクロスプラットフォームではうまく機能しないようです。たとえば、WindowsLAFは半透明性をサポートしていません。したがって、この実装がMac OSXで機能すると仮定して、これをWindowsで機能させるためのソリューションを探しています。アプリが実行されているオペレーティングシステムに基づいて、使用する実装をコードで指定できます。

4

4 に答える 4

7

コードとカーソル画像は、MacOS X 10.7.5(jdk 1.6.0_31)で、半透明の青い境界線で実際に望ましい結果を生成します。しかし、私はこの回答で、デフォルトのWindowsルックアンドフィールでは部分的な透過性がサポートされていないというオフコメントに気づきました。

于 2012-11-10T22:01:55.317 に答える
6

あなたが抱えている問題は、Cursor(Windowsでは)画像の透明度の値を考慮していないクラスに関係していることです

これは決して「実際の」解決策ではありませんが、結果を「混乱させる」ことに関するものです...

public class TestMouseCursor {

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

    public TestMouseCursor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MouseCursorPane());
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MouseCursorPane extends JPanel {

        private BufferedImage cursorImage;
        private Toolkit kit;

        public MouseCursorPane() {
            try {
                kit = Toolkit.getDefaultToolkit();
                cursorImage = ImageIO.read(getClass().getResource("/cursor02.png"));
                for (int i = 0; i < cursorImage.getHeight(); i++) {
                    int[] rgb = cursorImage.getRGB(0, i, cursorImage.getWidth(), 1, null, 0, cursorImage.getWidth() * 4);
                    for (int j = 0; j < rgb.length; j++) {
                        int alpha = (rgb[j] >> 24) & 255;
                        if (alpha < 128) {
                            alpha = 0;
                        } else {
                            alpha = 255;
                        }
                        rgb[j] &= 0x00ffffff;
                        rgb[j] = (alpha << 24) | rgb[j];
                    }
                    cursorImage.setRGB(0, i, cursorImage.getWidth(), 1, rgb, 0,
                            cursorImage.getWidth() * 4);
                }
                Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(
                        cursorImage, new Point(0, 0), "CustomCursor");

                setCursor(cursor);

            } catch (Exception exp) {
                exp.printStackTrace();
            }
        }
    }
}

ここでアイデアが浮かんだ

于 2012-11-13T05:45:54.110 に答える
2

別の方法は、カーソルを偽造することです。

アレクサンダーポトチキンの行儀の良いGlassPaneを見てください

特に、サンプルコードを実行し、とを選択Options>GlassPane is VisibleしますOptions>Final GlassPane

これから始めて、完全に透明なカーソル画像をロードしてから、適切なアルファブレンドカーソルをガラス板にペイントします。

于 2012-11-18T00:41:05.070 に答える
2

必死で絶対に透明なカーソルが必要な場合は、結果に関係なく、JNIを使​​用し、Win32APIを使用して手動でカーソルを設定できます。XP以降のWindowsはアルファカーソルをサポートしているので、それで問題ないはずです。

しかし、プラットフォームの独立性は失われます。また、Windowsの設定に基づいて、その特定のユーザーに対してアルファブレンディングがオフになっている場合があります。

于 2012-11-14T14:44:31.573 に答える