質問
を作成する方法はありますか? JButton
ボタン内の画像だけでなく、独自のボタン グラフィックを使用したいですか?
そうでない場合、カスタムを作成する別の方法はありますか JButton
ジャワでは?
解決
私が初めて Java を学んだとき、Yahtzee を作成する必要があり、すべてを 1 つに描画するのではなく、カスタムの Swing コンポーネントとコンテナーを作成するのがクールだと思いました。 JPanel
. 。延長するメリット Swing
もちろん、コンポーネントには、キーボード ショートカットやその他のアクセシビリティ機能のサポートを追加する機能が必要ですが、これらのコンポーネントがあるだけでは実現できません。 paint()
メソッドできれいな写真を印刷します。ただし、これは最良の方法ではないかもしれませんが、良い出発点になるかもしれません。
編集 8/6 - 画像では分からなかった場合、各ダイはクリックできるボタンです。これにより、次の場所に移動します。 DiceContainer
下に。ソース コードを見ると、各 Die ボタンがその値に基づいて動的に描画されていることがわかります。
基本的な手順は次のとおりです。
- 拡張するクラスを作成する
JComponent
- 親コンストラクターを呼び出す
super()
コンストラクター内で - クラスが実装していることを確認してください
MouseListener
これをコンストラクターに入れます。
enableInputMethods(true); addMouseListener(this);
これらのメソッドをオーバーライドします。
public Dimension getPreferredSize() public Dimension getMinimumSize() public Dimension getMaximumSize()
このメソッドをオーバーライドします。
public void paintComponent(Graphics g)
ボタンを描画するときに作業する必要があるスペースの量は、次のように定義されます。 getPreferredSize()
, と仮定すると getMinimumSize()
そして getMaximumSize()
同じ値を返します。これについてはあまり実験していませんが、GUI に使用するレイアウトによっては、ボタンの見た目がまったく異なる場合があります。
そして最後に、 ソースコード. 。何かを見逃した場合に備えて。
他のヒント
はい、可能です。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);
}
}
オーバーライドすることで注意してください ペイントコンポーネント ボタンの内容は変更できますが、境界線は ペイントボーダー 方法。の getPreferredSize コンテンツへの変更を動的にサポートするには、メソッドも管理する必要があります。フォントのメトリクスと画像の寸法を測定するときは注意が必要です。
信頼できるコントロールを作成する場合、上記のコードは正しいアプローチではありません。寸法と色は Swing では動的であり、使用されているルック アンド フィールによって異なります。デフォルトでも 金属 JRE のバージョン間で外観が変更されました。実装したほうがいいよ 抽象的なボタン また、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 の構造を理解すると、コントロールを作成する際に役立ちます。カスタムのルック アンド フィールを作成する
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>
そこのバインド要素は、マッピング先を指定します (この例では、name プロパティが「dirt」に設定されているボタンにそのスタイルが適用されます)。
役立つリンクもいくつかあります:
http://javadesktop.org/articles/synth/
http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html
私はおそらく間違った方向に何百万マイルも行くことになるでしょう(しかし私はまだ若いだけです :P )。しかし、グラフィックをパネルに追加してから、グラフィック オブジェクトにマウスリスナーを追加して、ユーザーがグラフィック上にいるときにアクションが実行されるようにすることはできませんでしょうか。
私は初期の CS クラス以来 SWING 開発を行っていませんが、それが組み込まれていない場合は継承するだけで済みます。 javax.swing.AbstractButton
そしてあなた自身のものを作成してください。既存のフレームワークと何かを接続するのは非常に簡単であるはずです。