2016-10-21 3 views
0

私はJavaグラフィックに慣れていないので、3つのボタンの上に線を描きたい。私は線を描くいくつかの方法を見つけましたが、どれもボタンの上に描画しませんでした。ここでJavaグラフィックス(線を描く)

は私のGUIクラスは

public class GUI extends JFrame{ 
JButton[] buttons; 

GUI() 
{ 
    setSize(255, 390); 
    setLocation(0, 0);  
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(null); 
    setVisible(true);  
} 
public void paint(Graphics g) { 
    super.paint(g); 
    //TODO add the line  
} 
void drawButtons() 
{ 
    buttons=new JButton[9]; 
    int x=5,y=80; 
    for(int i=0;i<buttons.length;i++) 
    { 
     buttons[i]=new JButton(""); 
     buttons[i].setSize(70,70); 
     buttons[i].setLocation(x,y); 
     buttons[i].setFont(new Font("Arial", Font.PLAIN, 45)); 
     buttons[i].setBorder(BorderFactory.createBevelBorder(1,Color.black,Color.black)); 
     y+=(i%3==2)?75:0; 
     x=(i%3==2)?5:x+75;   
     add(buttons[i]); 
    } 
} 

}

ですので、単純に、私はラインを作成し、パラメータとしてラインの位置を取得する関数を作成します。そして、私はそのラインをボタンの上にしたい。どうやってやるの?前もって感謝します。

+0

FYI:Swingのすべての描画は、paintComponentで行う必要があります。グラフィックスのクリッピングは、一般的に、複数のコンポーネントにわたってカスタムペイントすることを困難にします。 JLayerのチェックアウトをおすすめします。 – ControlAltDel

+0

@ControlAltDel paintComponentは私が持っているペイント関数ですか?とにかく、私はレイヤーを描画し、レイヤーをフレームに追加することができます。 – Ahmed

+0

https://docs.oracle.com/javase/tutorial/uiswing/painting/ – ControlAltDel

答えて

2

そして、私はボタンの上に線を置いて欲しいです。

JFrameの上に描画を行うためにそのpaintComponentメソッドをオーバーライドし、カスタム描画を行うためにGlass paneの使用を検討してください。例えば:あなたはその後、余談としてJFrame

setGlassPane(new CustomGlassPane()); 
getGlassPane().setVisible(true); 

のガラスペインを設定します

public class CustomGlassPane extends JPanel{ 

    public CustomGlassPane(){ 
     setOpaque(false); 
    } 

    @Override 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.RED); 
     g.drawLine(10, 100, 2000, 100); 
    } 
} 

、私はまた、nullレイアウトを使用しないことをお勧めします - 最良のあなたのレイアウトに合ったのLayoutManagerを選択します(とレイアウトを入れ子にすることができます)。また、paintではなく、paintComponentを上書きすることをお勧めします。

+0

'基本となるコンテナに追加されたコンポーネントの上に図面を作成する' - GlassPaneはコンテナだけでなくJFrame全体をカバーします。 – camickr

+0

@camickr訂正ありがとう – copeg

+0

これを自分のコードに適用してGraphics2Dを使って行にストロークを追加しましたが、行の位置を設定するのはかなり難しいです。数字を調整するだけですここでは "g.drawLine(10,100,2000,100);"またはライン位置を調整する簡単な方法はありますか? – Ahmed

2

A Closer Look at the Painting MechanismのSwingチュートリアルのセクションをご覧ください。

ご覧のとおり、JPanelはpaintChildren(...)メソッドを呼び出します。ですから、パネルの子どもたちの上に自分のラインをペイントするために、このメソッドをオーバーライドすることができます:

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

    // paint the line here 
} 

Proablyより良いオプションは、このために特別に設計されてJLayerを使用することです。詳細と例については、Decorating Components With JLayerのSwingチュートリアルのセクションを読んでください。