0

私はJavaに比較的慣れていないので、ボタンが押されたときにボックスを描画するGUIをコーディングしようとしています. 私の問題は、ボタンが押される前にプログラムがボックスを描画し、これを修正する方法がわからないことです。

これは私のコントローラクラスです:

import java.awt.*;
import javax.swing.*;
import java.awt.event.* ;


public class TestController extends JFrame {
private JButton enterButton;
private JPanel buttonHolder;
private Container contentPane;
private TestView view;

public TestController() {
    contentPane = getContentPane();
    enterButton = new JButton("Enter");
    buttonHolder = new JPanel();
    buttonHolder.setPreferredSize(new Dimension (600, 100));
    contentPane.add(buttonHolder, BorderLayout.SOUTH);

    buttonHolder.add(enterButton);

    view= new TestView();       
    view.setPreferredSize(new Dimension (125, 125));
    contentPane.add(view, BorderLayout.CENTER);

    enterButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            view.repaint(); 
        }
    });

}
public static void main(String[] args) {
     TestController bc = new TestController() ;
     bc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
     bc.pack();
     bc.setVisible(true) ;  

}

}

これは私のビュークラスです:

import java.awt.* ;     
import java.awt.geom.*;
import javax.swing.* ;

public class TestView extends JPanel {
public TestView() {}

public void paintComponent( Graphics g ){
    super.paintComponent( g );
    Graphics2D g2= ( Graphics2D ) g;
    Rectangle2D rect= new Rectangle2D.Double(0, 0, 30, 30); 
    g2.setPaint( Color.CYAN );
    g2.fill( rect );
}

}

4

2 に答える 2

1

方法はたくさんあります。

たとえば、ボタンが押されるまでの可視性TestViewを false に設定できます。

view.setVisible(false);

ボタンのアクションリスナーで:

view.setVisible(true);

問題が発生した理由:

作成したすべての Visual オブジェクトは、デフォルトで表示されます。オブジェクトをボードに追加すると、それが原因で描画されました。

この呼び出しにより、オブジェクトが表示されました: contentPane.add(view, BorderLayout.CENTER);

于 2013-04-05T23:37:45.633 に答える
1

まず第一に、Swing でペイント プロセスを制御しているという幻想を手放してください。Swing は、 によって制御されるパッシブな再描画プロセスを使用しRepaintManagerます。何をいつ再描画する必要があるかを決定するのは、このオブジェクトの責任です。

paintComponentによってあなたに代わって再描画チェーンの一部として呼び出されRepaintManager、さまざまな理由で呼び出される可能性があります (多くは直接制御できません)。

あなたのコードは、あなたが言ったことを正確に実行しています。

コンポーネントの描画状態を変更したい場合は、何らかの状態変数を使用してpaintComponent、長方形を描画するかどうかを指定する必要があります...

private boolean paintRect = false;

public void paintComponent( Graphics g ){
    super.paintComponent( g );
    if (paintRect) {
        Graphics2D g2= ( Graphics2D ) g;
        Rectangle2D rect= new Rectangle2D.Double(0, 0, 30, 30); 
        g2.setPaint( Color.CYAN );
        g2.fill( rect );
    }
}

TreeView次に、クラス内の状態変数への何らかのアクセスを提供する必要があります。

public void setPaintRect(boolean paint) {
    paintRect = paint;
    repaint();
}

今、あなたのactionPerformedメソッドでは、単に状態を設定する必要があります...

enterButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        view.setPaintRect(true); // or what ever you want.
    }
});

余談ですが。オーバーライドして、他のレイアウト マネージャーに適したサイズのヒントを返すTreeView必要があります。getPreferredSizeフレームのサイズを使用BorderLayoutして手動で設定することでそれを回避しましたが、TreeViewのデフォルトのサイズは 0x0 です。

を見てみましょう

詳細については

于 2013-04-05T23:57:25.813 に答える