2

ボタンを押したときに四角形を描きたいのですが、うまくいきません。ここに私のコードがあります:

package draw.rect;

import java.awt.BorderLayout;
import java.awt.EventQueue;

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

public class DR extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    DR frame = new DR();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public DR() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 458, 312);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JButton btnDrawRrect = new JButton("Draw Rrect");
        btnDrawRrect.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.print("hello");
                RectangleComponent r2 = new RectangleComponent();
                contentPane.add(r2);
                r2.revalidate();
                contentPane.revalidate();
            }
        });
        btnDrawRrect.setBounds(10, 11, 89, 23);
        contentPane.add(btnDrawRrect);    
    }
}

package draw.rect;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;

import javax.swing.JComponent;

public class RectangleComponent extends JComponent {

      Rectangle rect;

      public RectangleComponent()
      {
        rect  = new Rectangle(50, 50, 120, 130);
      }

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

問題は、アクション イベント リスナーが呼び出されたときに、JComponent が適切に構築されているにもかかわらず、フレームに追加されていないことです。前もって感謝します

4

1 に答える 1

5

null レイアウトを使用しており、その場合、コンテナーを使用して null レイアウトに追加されたコンポーネントのサイズと位置を設定する責任があります。あなたはこの責任を無視しており、追加した JComponent にサイズや位置を与えていません。そのため、コンテナーに追加されている間、サイズが 0 であるため表示できません。これを自分で証明するには、System.out を追加します。追加されたコンポーネントが表示されているかどうか、およびその境界が何であるかを出力する println() は、自分で確認できます。2番目の問題は、コンポーネントを追加した後に呼び出していないことですがrepaint()、これは必ずしも必要ではなく、現在の問題の理由ではありません. 簡単な解決策は、新しく追加されたコンポーネントの境界を設定することですが、これを行うことはお勧めしません。代わりに、次のことをお勧めします。

  • null レイアウトを使用すると、コードの柔軟性が失われ、保守とアップグレードが非常に困難になるため、使用しないことを強くお勧めします。
  • チュートリアルを読んで、レイアウト マネージャーを使用してください。
  • コンテナーからコンポーネントを削除または追加した後、コンテナーに対して を呼び出しrevalidate()ますrepaint()
于 2013-03-03T06:43:12.543 に答える