2012-02-14 4 views
3

私はGUI上で簡単なプロジェクトを開始する、初心者ですと四角形を描画します。 RectangleComponentはボタンクリックでフォーム上にRectangleを描画する必要があります。四角形は次のコードでは描画されませんが、同じ2行のコードをリスナーの外に置くと、確かに機能します。助けていただければ幸いです。ボタン

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.BorderLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class EllipseRectViewer { 
/** 
* @param args 
*/ 
public static void main(String[] args) 
{ 
    final JFrame frame = new JFrame(); 

    final int FRAME_WIDTH = 400; 
    final int FRAME_HEIGHT = 400; 
    frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    frame.setTitle("Rectangle and Ellipse Draw"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new BorderLayout()); 

    JPanel panel = new JPanel(); 
    frame.add(panel, BorderLayout.NORTH); 

    class RectangleDrawListener implements ActionListener 
    { 
    public void actionPerformed(ActionEvent event) 
    { 
     RectangleComponent r2 = new RectangleComponent(); 
     frame.add(r2); 
    }  
    } 
    JButton rectButton = new JButton("Rectangle"); 
    ActionListener rectDrawListener = new RectangleDrawListener(); 
    rectButton.addActionListener(rectDrawListener); 
    panel.add(rectButton); 

    frame.setVisible(true); 
    } 
} 

import java.awt.Rectangle; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JComponent; 

public class RectangleComponent extends JComponent 
{ 
    Rectangle rect; 

    public RectangleComponent() 
    { 
    rect = new Rectangle(20, 20, 30, 30); 
    } 

    public void paintComponent(Graphics g) 
    { 
    Graphics2D g2 = (Graphics2D) g; 
    g2.draw(rect); 
    } 
} 

ありがとうございます。

答えて

3

私はあなたが)(フレームを再検証する必要があると思います。

frame.revalidate();

このようにそれを置く:

public void actionPerformed(ActionEvent event) 
{ 
    RectangleComponent r2 = new RectangleComponent(); 
    frame.add(r2); 
    frame.revalidate(); 
}  
+0

いいえ... JFrameはJComponentではありませんが、jdk7以来、Componentはrevalidate(情報のために@AndreasDに感謝)をサポートしていますので、downvoteを削除しました – kleopatra

1

はのLineBorderを使用してみてください。 LineBorderでJPanelを作成し、JButtonをJPanelに追加します。フレームにRectangleComponentを追加した後

4

、いずれかの新たに追加されたコンポーネント又はフレームのルート区画再検証:

public void actionPerformed(ActionEvent event) { 
    RectangleComponent r2 = new RectangleComponent(); 
    frame.add(r2); 
    // Option 1 
    r2.revalidate(); 
    // Option 2 
    frame.getRootPane().revalidate(); 
} 

を注:フレーム自体は
(JDK 1.6件まで)再検証することができません注2:フレーム自体は、(JDK 1.7以上)

+0

なぜフレーム自体を再検証できないのか簡単に教えてください?私はframe.revalidate()を試してみました。私は確信していませんが、JDK 7またはそれ以前のバージョンでは若干の違いがあります。以前は、getRootPane()を使って多くのことをするために使用していました。 –

+0

ああ、JRE7で 'JFrame'を再検証できるようですね! (http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#revalidate%28%29)[これは新しいものです]。すべての以前のバージョン:rootPaneを使うか、子コンポーネントを再検証してください。 –

+0

(http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html# [Component.revalidate()] Iは、単にJDK 7でメモ帳を使用していますし、それが完璧に動作していますrevalidate())。私の悪いが、私はすぐにJDK以前のバージョンを残した情報のためのありがとうは、私はJDK 7が溝の中にまだない、ことを行っているべきではありませんので、ちょうど多くの質問で私の頭をクリア、のように思えます。良い情報のためにも+1 :-)よろしくお願いしますNote2のために –

1

RECT =新しいRectangle(20、20、30、30)再検証することができます。

第2の問題は、コンポーネントに推奨サイズがないことです。コンポーネントは、BorderLayoutの中心にコンポーネントを追加するため、コンポーネントの優先サイズが無視されるため、単純なフレームで表示されます。ただし、他のレイアウトマネージャを使用しているときにコンポーネントを使用しようとすると、これは機能しません。

また、あなたが使用する必要が最小であなたのコンポーネントの推奨サイズを返すためのgetPreferredSize()メソッドをオーバーライドする必要があります。塗装の四角形のサイズと位置を収容するために

return new Dimension(50, 50);