0

頭を描画する小さな Swing プログラムを作成しました。ユーザーが JCheckBox インスタンスを選択/選択解除すると、頭の上に帽子が描画または削除されます。このプログラムで次のステップに進むのに問題があります。このコンポーネントが MouseListener でマウス イベントをリッスンするようにするブール フィールドを Head クラスに追加したいと考えています。そこから、2 つのメソッドを使用してこのフィールドを true/false に設定し、残りの 3 つのメソッドをレイム ダックにレンダリングしたいと考えています。また、ブール値がtrueの場合、オブジェクトが目を開いて描画され、falseの場合、目を閉じて頭が描画されるように、paintComponentメソッドを変更するにはどうすればよいですか? アドバイスがあれば教えてください。どうもありがとう!

import javax.swing.*;
import java.awt.geom.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;


public class Head extends JPanel {
Rectangle2D.Double chapeau, chapeau2;
Ellipse2D.Double bouche, visage, oeil1, oeil2;
JCheckBox box;

public Head(){
   this.setBackground(Color.WHITE);

  visage = new Ellipse2D.Double (150,130,100,100);
  bouche = new Ellipse2D.Double (170,180,60,27);
  chapeau = new Rectangle2D.Double (170,80,60,40);
  chapeau2 = new Rectangle2D.Double (125,120,150,10);
  oeil1 = new Ellipse2D.Double (170,150,20,20);
  oeil2 = new Ellipse2D.Double (210,150,20,20);

  box = new JCheckBox("Hat");
  this.add(box);
  box.addItemListener(new ItemListener(){

    public void itemStateChanged(ItemEvent ie){
       repaint();
        }
     });
  }
      public void paintComponent(Graphics g){
         super.paintComponent(g);
         Graphics2D g2 = (Graphics2D)g;
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
         RenderingHints.VALUE_ANTIALIAS_ON);
         g2.setStroke(new BasicStroke(3.0f));
         g2.setPaint(Color.BLUE);
         g2.draw(visage);
         g2.draw(oeil1);
         g2.draw(oeil2);
         g2.draw(bouche);

            if(box.isSelected()){
              g2.draw(chapeau);
              g2.draw(chapeau2);
          }
     }
      public static void main(String[] args){
         JFrame f = new JFrame("Face Display Window");
         f.setSize(425,285);
         f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
         f.setVisible(true);
         f.add(new Head());
     }
}

----------------------------------- 2 回目の試行

 import javax.swing.*;
 import java.awt.geom.*;
 import java.awt.*;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;


 public class Head extends JPanel implements MouseListener {
 Rectangle2D.Double chapeau, chapeau2;
 Ellipse2D.Double bouche, visage, oeil1, oeil2, oeil3, oeil4;
 JCheckBox box;
 boolean isClosed = false;

 public Head(){
 this.setBackground(Color.WHITE);


 visage = new Ellipse2D.Double (150,130,100,100);
 bouche = new Ellipse2D.Double (170,180,60,27);
 chapeau = new Rectangle2D.Double (170,80,60,40);
 chapeau2 = new Rectangle2D.Double (125,120,150,10);
 oeil1 = new Ellipse2D.Double (170,150,20,20);
 oeil2 = new Ellipse2D.Double (210,150,20,20);
 oeil3 = new Ellipse2D.Double (175,155,25,25);
 oeil4 = new Ellipse2D.Double (215,155,25,25);

 box = new JCheckBox("Hat");
 this.addMouseListener(this);
 this.add(box);
 box.addItemListener(new ItemListener(){

      public void itemStateChanged(ItemEvent ie){
         repaint();
      }
  });
  }


      public void paintComponent(Graphics g){
         super.paintComponent(g);
         Graphics2D g2 = (Graphics2D)g;
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
         RenderingHints.VALUE_ANTIALIAS_ON);
         g2.setStroke(new BasicStroke(3.0f));
         g2.setPaint(Color.BLUE);
         g2.draw(visage);
         g2.draw(oeil1);
         g2.draw(oeil2);
         g2.draw(bouche);

            if(box.isSelected()){
              g2.draw(chapeau);
              g2.draw(chapeau2);

            if(isClosed) {
                g2.draw(oeil3);
                g2.draw(oeil4);
            }
            else {
                g2.draw(oeil1);
                g2.draw(oeil2);
            }


            }
     }

      @Override
    public void mouseClicked(MouseEvent e) {

       isClosed = !isClosed;  

    repaint();  

    }
    @Override
    public void mousePressed(MouseEvent e) {


    }
    @Override
    public void mouseReleased(MouseEvent e) {


    }
    @Override
    public void mouseEntered(MouseEvent e) {


    }
    @Override
    public void mouseExited(MouseEvent e) {


    }


      public static void main(String[] args){
         JFrame f = new JFrame("Face Display Window");
         f.setSize(425,285);
         f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
         f.setVisible(true);
         f.add(new Head());
     }
}
4

1 に答える 1

0

これが宿題かどうかわからないので、ここでは意図的に少しあいまいにしていますとても難しいことではありません。ただし、実際に行き詰まっている場合は、明確にしてください。必要に応じて詳細を追加します.

  1. このコンポーネントが MouseListener でマウス イベントをリッスンするようにするブール フィールドを Head クラスに追加したいと思います。

    これはそれほど難しいことではありません。booleanクラスにフィールドを追加するのHeadは簡単です。宣言するだけです。これは、コードが後で目を引く命令として解釈するboolean isClosed = false;フィールド セットで実行を開始することを示します。false

    あなたのコア要件はMouseListener. イベントの Java Trail をまだチェックしていない場合は、チェックしてください。シンプルな実装方法を説明していますMouseListener。この時点で、MouseListenerはインターフェイスであるため、空のメソッドであっても、すべてのメソッドの実装を提供する必要があることに注意してください。MouseAdapter 抽象クラスを調べてみてください。これらすべてのメソッド (およびそれ以上) の空の実装を提供するため、必要なものだけをオーバーライドする必要があります。これにより、コンパイラを満足させるためだけに空のメソッドがたくさんないため、コードがよりクリーンになります。これは、「」と言うときに言及していると思われる問題を解決し、残りの3つのメソッドをレームダックにレンダリングしますもちろん、すでに JPanel を拡張MouseAdapterしているため、同様に拡張することはできないため、ここでは当てはまりません。しかし、これは (他のアダプターと共に) 後で覚えておくと便利なクラスです。

  2. そこから、2 つの方法を使用してこのフィールドを true/false に設定したいと思います

    私があなたを正しく理解していれば、あなたが望むのは、isClosedマウスクリックでの値を切り替えることです。だから今、あなたは実際には何もしないMouseListener/を持っています。MouseAdapter次に行う必要があるのは、フィールドMouseClicked()の値を切り替えるメソッドの実装を提供することです。booleanこれも非常に簡単です。!(NOT) 演算子を使用して現在の値を反転し、変数に代入するだけですisClosed = !isClosed;Java の演算子について詳しく読みたいと思うかもしれません。

  3. また、ブール値がtrueの場合、オブジェクトが目を開いて描画され、falseの場合、目を閉じて頭が描画されるように、paintComponentメソッドを変更するにはどうすればよいですか?

    これを行う 1 つの方法は、閉じた 2 つの目に対して、開いた目と同様の形状をさらに 2 つ作成することです。それができたら、 の値に基づいてどちらを描くか (つまり、閉じた目か開いた目か) を決定するのは簡単なことですisClosed。したがって、ifを使用して の値をチェックし、 の場合はisClosed目を開け、 の場合falseは目を閉じtrueます。の値はisClosedクリック ハンドラーで変更されているため、値を変更するときに必ず呼び出す必要があることに注意してください。repaint()そうしないと、Swing がパネルをすぐに更新して変更を表示しない可能性があるため、何も起こらない可能性があります。

要約すると、必要なことを行う 1 つの方法は、次の変更を に加えることHeadです。

public class Head 
    extends JPanel 
    implements MouseListener {

    //...all your other declarations still go here
    boolean isClosed = false;

    //also declare new 'eyes' which are closed

    public Head() {
        //..all your existing code is still here
        //add code to instantiate closed eyes

        //need to register a new MouseListener 
        //since head itself is a MouseListener, we can pass this as the argument
        this.addMouseListener(this);
    }

    //...all your existing code still goes here

    public void paintComponent(Graphics g) {
        //...all your existing code still goes here

        //decide which eyes to draw depending on isClosed
        if(isClosed) {
            //draw closed eyes
        }
        else {
            //draw open eyes
        }
        //draw everything else as before
    }

    //implementation for MouseListener
    //don't forget the rest of the MouseListener events
    //mousePressed, mouseReleased, mouseEntered, mouseExited
    public void mouseClicked(MouseEvent e) {
        //toggle the value of isClosed
        isClosed = !isClosed;

        //must repaint
        repaint();
    }
于 2011-03-03T03:44:20.890 に答える