【问题标题】:Expanding on Java Swing/AWT Program扩展 Java Swing/AWT 程序
【发布时间】:2011-03-03 02:56:46
【问题描述】:

我编写了一个绘制头部的小型 Swing 程序,当用户选择/取消选择 JCheckBox 实例时,会从头顶绘制或移除帽子​​。我在执行该程序的下一步时遇到了一些麻烦——我想向 Head 类添加一个布尔字段,使该组件使用 MouseListener 侦听鼠标事件。从那里开始,我想使用两种方法将此字段设置为真/假,并渲染其余三种方法跛脚鸭。另外,我将如何更改paintComponent 方法,以便如果布尔值为true,则对象是睁着眼睛绘制的,如果为false,则头部是闭着眼睛绘制的?请提供您的任何建议。非常感谢!

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

【问题讨论】:

    标签: java swing draw jcheckbox paintcomponent


    【解决方案1】:

    我故意在这里有点含糊,因为我不确定这是否是家庭作业,因为你已经有相当多的代码可以做很多与你想要的非常相似的事情它和修改它应该不是很困难。但是,如果您真的被卡住了,请澄清一下,如果需要,我会添加更多详细信息。

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

      这不是太难,让我们逐步完成。将boolean 字段添加到Head 类很简单——你只需声明boolean isClosed = false;——表明你开始执行时将字段设置为false,你的代码稍后会将其解释为睁开眼睛的指令.

      您的核心要求是MouseListener。如果您还没有,请查看the Java Trail for events;它解释了如何实现一个简单的MouseListener。此时,请注意 MouseListener 是一个接口,因此,您必须为它的所有方法提供一个实现,即使它们是空体方法。您可能想查看the MouseAdapter abstract class。它提供了所有这些方法(以及更多)的空实现,因此您只需要覆盖您需要的那些 - 这使您的代码更清晰,因为您没有一堆空方法只是为了满足编译器。这将解决我相信您在说“并渲染其余三个方法跛脚鸭”时所指的问题当然,由于您已经在扩展 JPanel,因此不能扩展 @987654332 @ 也是如此,所以这不适用于这里。但是这个(和其他适配器)是一个有用的类,以后要记住。

    2. 从那里,我想用两种方法来设置这个字段为真/假

      如果我理解正确,您想要的是在鼠标点击时切换isClosed 的值。所以现在,你有一个MouseListener/MouseAdapter,它并没有真正做任何事情。您接下来需要做的是为MouseClicked() 方法提供一个实现,您可以在其中切换boolean 字段的值。这也很简单 - 您只需使用 ! (NOT) 运算符反转当前值并将其分配回变量 - isClosed = !isClosed;。您不妨阅读operators in Java in more detail

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

      这样做的一种方法是为两只闭合的眼睛再创建两个形状,类似于睁开眼睛的形状。完成此操作后,根据isClosed 的值决定绘制哪些(即闭上的眼睛或睁开的眼睛)就很简单了。因此,您将使用if clause 来检查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();
        }
    

    【讨论】:

    • 首先感谢您的帮助。非常感谢。但是,在实施您建议的项目后,它仍然无法正常工作,我有些困惑。我知道这是一个简单的问题,但我还是 Java 世界的新手。这就是我现在所拥有的(见上文):
    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多