3

カスタムスイングコンポーネントが必要なプロジェクトを行っています。これまでのところ、一連の画像を使用して新しいボタンを作成しました (Java Metal の外観は私の UI にまったく適合しません)。MouseListenerこの新しいコンポーネントに実装しましたが、ここで問題が発生します。私のウィジェットは、ホバー、クリックなどで画像を変更しますが、マウスのエントリを画像ではなくコンテナーMouseListener全体にピックアップします。GridLayoutしたがって、約200 * 100の画像があり、周囲のコンテナは約400 * 200であり、画像の上ではなく、そのセクション(空白部分であっても)にmouseEntered入るとメソッドが起動されます。GridLayout画像の上にカーソルを置いたときにのみ起動されるようにするにはどうすればよいですか? サイズと境界、およびその他の属性を無駄に設定しようとしました。

編集:これは私の問題のデモンストレーションです。ご覧のとおり (色は非常に似ています)、右下のボタンは、 のセクションに入るだけで強調表示されますGridlLayout。セクションではなく、実際の画像の上にいるときにのみ強調表示しGridLayoutます。

代替テキスト

MouseListener表示される画像を切り替えるだけなので、メソッドは追加しません。

public customWidget()
{
    this.setLayout(new FlowLayout());
    try {
        imageDef=ImageIO.read(new File("/home/x101/Desktop/buttonDef.png"));
        imageClick=ImageIO.read(new File("/home/x101/Desktop/buttonClick.png"));
        imageHover=ImageIO.read(new File("/home/x101/Desktop/buttonHover.png"));
        current=imageDef;
    } catch (IOException e) 
    {

        e.printStackTrace();
    }
    this.addMouseListener(this);
}

protected void paintComponent(Graphics g)
{
    super.paintComponents(g);
    g.drawImage(current, 0, 0, current.getWidth(), current.getHeight(), null);

}

編集:コードセクションを追加

4

3 に答える 3

8

別の方法として、ボタンAPIを検討してください。これには、 setRolloverIcon()「カーソルがボタンの上を通過したときにボタンに指定されたアイコンを表示させる」メソッドが含まれています。

補遺:例えば

import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ButtonIconTest {

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }

    private static void createAndShowGui() {
        String base = "http://download.oracle.com/"
            + "javase/tutorial/uiswing/examples/components/"
            + "RadioButtonDemoProject/src/components/images/";
        ImageIcon dog = null;
        ImageIcon pig = null;
        try {
            dog = new ImageIcon(new URL(base + "Dog.gif"));
            pig = new ImageIcon(new URL(base + "Pig.gif"));
        } catch (MalformedURLException ex) {
            ex.printStackTrace(System.err);
            return;
        }
        JFrame frame = new JFrame("Rollover Test");
        JPanel panel = new JPanel();
        panel.add(new JLabel(dog));
        panel.add(new JLabel(pig));

        JButton button = new JButton(dog);
        button.setRolloverIcon(pig);
        panel.add(button);

        frame.add(panel);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
于 2010-11-13T00:41:25.307 に答える
3

あなたの画像には、4つの「customWidget」オブジェクトのみが含まれていると思います(2x2グリッド内)。

あなたのコードは期待どおりに機能しています。MouseListener メソッドは、'customWidget' ('customWidget' で描画された画像ではない) の MouseEvents に応答しています。これは、画像の 1/4 を占めるようにサイズ設定されているため、拡大領域に入ると応答します。カスタムボタンウィジェットを画像よりも大きくできるようにしているため、実際にはテストプログラムにエラーがあります。

自分の画像と同様の画像を提供するテスト プログラムが必要な場合は、より大きなグリッド (たとえば 4x4) を作成し、ボタンを 1 つおきのグリッド ノードにのみ配置する必要があります。隙間に空のコンポーネントを配置します。

于 2010-11-13T00:55:21.177 に答える
0

あなたの特定の質問にはお答えしませんが、これがお役に立てば幸いです。

コンポーネントが正しく表示されない場合は、Swing コンポーネントを再利用して、カスタムの Look&Feel またはテーマを作成する必要があります。

アプリケーションの外観に一貫性を持たせ、少なくとも目的のタスクに適したツールを使用していることを確認するのに役立ちます。

補足として、Java には、ネイティブ OS テーマを模倣するために作成された Look&Feels を含む、複数の Look&Feels が付属していることに注意してください。

参照: http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

于 2010-11-13T00:29:21.030 に答える