繁体   English   中英

在Java Swing / AWT程序上扩展

[英]Expanding on Java Swing/AWT Program

我已经写了平头,并且在选择一个JCheckBox的实例/未选中的用户帽子绘制或从头顶取下一个小的Swing程序。 我有一些麻烦采取这种方案的下一步 - 我想一个布尔字段添加到导致该组件听取了MouseListener的鼠标事件元首级。 从那里开始,我想使用两种方法将此字段设置为true / false并渲染其余三种方法。 另外,我怎么会改变的paintComponent方法,这样,如果布尔值是true绘制对象睁着眼睛,如果它是假的,头部被画成与闭眼? 请提供您的任何建议。 非常感谢!

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());
     }
}

-----------------------------------第二次尝试

 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());
     }
}

我故意在这里含糊不清,因为我不确定这是否是家庭作业,因为您已经有大量的代码,可以执行很多与您想要的内容非常相似的工作,并且不应该对其进行修改不会很困难。 但是,如果您确实遇到困难,请进行澄清,如果需要,我会添加更多详细信息。

  1. 我想向Head类添加一个布尔字段,该字段使该组件使用MouseListener侦听鼠标事件。

    这不太难,让我们逐步完成。 Head类中添加一个boolean字段很简单-您只需声明boolean isClosed = false; -表示您在将字段设置为false的情况下开始执行,之后您的代码将其解释为使眼睛睁开的指令。

    您的核心要求是MouseListener 如果还没有,请查看Java Trail中的事件 它说明了如何实现简单的MouseListener 此时,请注意, MouseListener是一个接口,因此,即使它们是空方法,您也必须为其所有方法提供实现。 您可能需要检出MouseAdapter抽象类 它提供了所有这些方法(以及更多方法)的空实现,因此您只需要覆盖所需的方法即可-这使您的代码更整洁,因为您没有一堆空方法只能满足编译器的要求。 这将解决我相信您在说“ 并使其余三个方法la脚的鸭子 ”时所指的问题。当然,由于您已经在扩展JPanel,因此无法扩展MouseAdapter ,因此这并不适用这里。 但这(与其他适配器)是一个有用的类,供以后记住。

  2. 从那里,我想使用两种方法将此字段设置为true / false

    如果我理解正确,那么您想要的是在单击鼠标时切换isClosed的值。 因此,现在,您有一个MouseListener / MouseAdapter并没有真正执行任何操作。 接下来需要做的就是为MouseClicked()方法提供一个实现,您可以在其中切换boolean字段的值。 这也很容易-您只需使用!反转当前值即可! (NOT)运算符并将其分配回变量isClosed = !isClosed; 您可能希望更详细地阅读Java中的运算符

  3. 另外,我将如何更改paintComponent方法,以便如果布尔值是true,则用睁开的眼睛绘制对象,如果布尔值是false,则用闭合的眼睛绘制头部?

    一种方法是为两只闭合的眼睛再创建两个形状,类似于您的睁开眼睛的形状。 完成此操作后,只需根据isClosed的值确定要绘制的对象(即闭合的眼睛或睁开的眼睛)即可。 因此,您将使用if子句检查isClosed的值,并在false时绘制睁开的眼睛,在true时绘制睁开的眼睛。 请注意,由于在单击处理程序中正在修改isClosed的值,因此需要确保在更改值时调用repaint() ,否则Swing可能不会立即更新面板以显示更改,因此您将看不到什么都发生

综上所述,一种方法是对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();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM