2008-08-05 23 views
85

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

もしそうでなければ、JavaでカスタムJButtonを作成する別の方法はありますか?

答えて

85

私が最初に私たちはヤッツィーをしなければならなかったと私はそれがに涼しいだろうと思ったのJavaを学んでいたときスクロールコンポーネントとコンテナを作成する代わりに、すべてを1つの図形に描画するのではなく、JPanelです。 Swingコンポーネントを拡張する利点はもちろん、paint()メソッドを使用してきれいな画像を印刷するだけではできないキーボードショートカットやその他のアクセシビリティ機能のサポートを追加することができます。しかし、これは最善の方法ではないかもしれませんが、それはあなたにとって良い出発点になるかもしれません。

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

alt text
alt text
alt text

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

  1. はあなたのクラスを確認してくださいあなたのコンストラクタ
  2. JComponent
  3. コール親コンストラクタsuper()を拡張するクラスを作成します。を実装する
  4. コンストラクタでこれを置く:

    enableInputMethods(true); 
    addMouseListener(this); 
    
  5. オーバーライドこれらの方法:

    public Dimension getPreferredSize() 
    public Dimension getMinimumSize() 
    public Dimension getMaximumSize() 
    
  6. オーバーライドこの方法:複数の

    public void paintComponent(Graphics g) 
    

量あなたのボタンを描画するときに作業するペースは、で定義されます。getMinimumSize()getMaximumSize()は同じ値を返します。私はこれをあまり試してみませんでしたが、あなたのGUIに使用するレイアウトによってはボタンが全く違って見えます。

最後にsource codeです。私が何かを見逃した場合。

+1

こんにちは、最初のコードのおかげで!あなたのコードに 'setActionComme(String Command)'を追加することをお勧めします。 Swingでイベントをフィルタリングする方法の1つです。 (ただし、あなたは、物事を少し良くするために追加できる1001ものがあると主張することができます:P) –

+1

全体のコードをここに入れることができますか? –

+0

あなたが押すことができるダイを作成するには、setIcon/setPressedIconとJButtonの他のIcon機能を利用して、実際には普通の古いJButtonを使用することができます(カスタムJComponentをサブクラス化するか作成するのではなく)。 – ControlAltDel

6

私は初期のCSクラスからSWING開発を行っていませんが、それが組み込まれていない場合は、javax.swing.AbstractButtonを継承し、独自に作成することができます。既存のフレームワークと一緒に何かを配線するのはかなりシンプルでなければなりません。

12

いつも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要素はにマッピングするかを指定します(この例では、それは、その名のプロパティ汚れ」に設定されている任意のボタンにそのスタイルを適用します")。

、便利なリンクのカップル:

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

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

32

はい、これが可能です。 Swingを使用する主な利点の1つは、抽象的なコントロールを作成して操作することが容易であることです。

既存のJButtonクラスを拡張してテキストの右側に円を描く、すばやく汚れた方法です。 paintComponentをオーバーライドすることにより、ボタンの内容を変更することができることが、境界をのpaintBorder方法により塗装されていることを

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バージョン間で見た目が変更されています。 AbstractButtonを実装し、Swing APIによって設定されたガイドラインに従う方がよいでしょう。良い出発点は、javax.swing.LookAndFeeljavax.swing.UIManagerクラスを参照することです。Look&Feelの解剖学を理解する

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

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

コントロールを作成する場合に便利です: Creating a Custom Look and Feel

8

私はたぶん間違った直接の(しかし、私は唯一の若いです:P)の百万マイルになります。グラフィックをパネル上に追加してからグラフィックオブジェクトに追加することはできませんでしたので、グラフィック上のユーザーがあなたのアクションが実行されたときに表示されるようになりました。

+1

可能であれば、自分のタイプのボタンを作成するよりも、標準のJButtonを使用する方が好きです。 – Anton

関連する問題