102

JButtonボタン内の画像だけでなく、独自のボタン グラフィックを作成する方法はありますか?

JButtonそうでない場合、Javaでカスタムを作成する別の方法はありますか?

4

5 に答える 5

96

私が最初に Java を学習したとき、Yahtzee を作成する必要がありました。すべてを 1 つのJPanel. もちろん、コンポーネントを拡張する利点は、メソッドにきれいな画像Swingを出力させるだけではできない、キーボード ショートカットやその他のアクセシビリティ機能のサポートを追加できることです。paint()最善の方法ではないかもしれませんが、良い出発点になるかもしれません。

編集 8/6 - 画像から明らかでない場合、各ダイはクリックできるボタンです。これで下に移動しDiceContainerます。ソース コードを見ると、各ダイ ボタンがその値に基づいて動的に描画されていることがわかります。

代替テキスト
代替テキスト
代替テキスト

基本的な手順は次のとおりです。

  1. 拡張するクラスを作成するJComponent
  2. super()コンストラクターで親コンストラクターを呼び出す
  3. クラスが実装していることを確認してくださいMouseListener
  4. これをコンストラクタに入れます:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. これらのメソッドをオーバーライドします。

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. このメソッドをオーバーライドします。

    public void paintComponent(Graphics g)
    

ボタンを描画するときに使用する必要があるスペースの量は、 によって定義されgetPreferredSize()、同じ値を想定してgetMinimumSize()getMaximumSize()返します。これについてはあまり実験していませんが、GUI に使用するレイアウトによっては、ボタンの外観がまったく異なる場合があります。

最後にソースコードです。私が何かを逃した場合に備えて。

于 2008-08-05T13:03:43.707 に答える
35

はい、可能です。Swing を使用する主な利点の 1 つは、抽象コントロールを簡単に作成および操作できることです。

これは、既存の JButton クラスを拡張して、テキストの右側に円を描画する簡単で汚い方法です。

package test;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyButton extends JButton {

    private static final long serialVersionUID = 1L;

    private Color circleColor = Color.BLACK;

    public MyButton(String label) {
        super(label);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Dimension originalSize = super.getPreferredSize();
        int gap = (int) (originalSize.height * 0.2);
        int x = originalSize.width + gap;
        int y = gap;
        int diameter = originalSize.height - (gap * 2);

        g.setColor(circleColor);
        g.fillOval(x, y, diameter, diameter);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.width += size.height;
        return size;
    }

    /*Test the button*/
    public static void main(String[] args) {
        MyButton button = new MyButton("Hello, World!");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new FlowLayout());
        contentPane.add(button);

        frame.setVisible(true);
    }

}

ボタンのコンテンツを変更できるpaintComponentをオーバーライドすることにより、境界線はpaintBorderメソッドによってペイントされることに注意してください。コンテンツへの変更を動的にサポートするには、getPreferredSizeメソッドも管理する必要があります。フォント メトリックと画像のサイズを測定するときは注意が必要です。

信頼できるコントロールを作成する場合、上記のコードは正しいアプローチではありません。寸法と色は Swing では動的であり、使用されているルック アンド フィールに依存します。デフォルトのMetalの外観でさえ、JRE のバージョン間で変更されています。AbstractButtonを実装し、Swing API によって設定されたガイドラインに準拠することをお勧めします。良い出発点は、javax.swing.LookAndFeelおよびjavax.swing.UIManagerクラスを調べることです。

http://docs.oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html

http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html

LookAndFeel の構造を理解することは、コントロールを記述するのに役立ちます。 カスタム ルック アンド フィールの作成

于 2008-08-05T12:53:35.990 に答える
15

Synth のルック アンド フィールをいつでも試すことができます。一種のスタイルシートとして機能する xml ファイルと、使用する画像を提供します。コードは次のようになります。

try {
    SynthLookAndFeel synth = new SynthLookAndFeel();
    Class aClass = MainFrame.class;
    InputStream stream = aClass.getResourceAsStream("\\default.xml");

    if (stream == null) {
        System.err.println("Missing configuration file");
        System.exit(-1);                
    }

    synth.load(stream, aClass);

    UIManager.setLookAndFeel(synth);
} catch (ParseException pe) {
    System.err.println("Bad configuration file");
    pe.printStackTrace();
    System.exit(-2);
} catch (UnsupportedLookAndFeelException ulfe) {
    System.err.println("Old JRE in use. Get a new one");
    System.exit(-3);
}

そこから、通常どおりに JButton を追加します。唯一の変更点は、setName(string) メソッドを使用して、xml ファイル内でボタンをマップする対象を識別することです。

xml ファイルは次のようになります。

<synth>
    <style id="button">
        <font name="DIALOG" size="12" style="BOLD"/>
        <state value="MOUSE_OVER">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
        <state value="ENABLED">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
    </style>
    <bind style="button" type="name" key="dirt"/>
</synth>

そこでの bind 要素は、マップ先を指定します (この例では、name プロパティが「dirt」に設定されているすべてのボタンにそのスタイルが適用されます)。

そして、いくつかの便利なリンク:

http://javadesktop.org/articles/synth/

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html

于 2008-08-05T12:47:17.967 に答える
9

私はおそらく間違った直行で百万マイル行くでしょう(しかし私は若いだけです:P)。ただし、グラフィックをパネルに追加してから、マウスリスナーをグラフィックオブジェクトに追加して、グラフィック上のユーザーがアクションを実行できるようにすることはできませんでした。

于 2008-08-20T15:48:56.063 に答える
8

初期の CS クラス以来、私は SWING 開発を行っていませんが、組み込まれていない場合は、継承javax.swing.AbstractButtonして独自のものを作成できます。何かを既存のフレームワークと結び付けるのは非常に簡単なはずです。

于 2008-08-05T12:30:34.757 に答える