[英]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());
}
}
我故意在这里含糊不清,因为我不确定这是否是家庭作业,因为您已经有大量的代码,可以执行很多与您想要的内容非常相似的工作,并且不应该对其进行修改不会很困难。 但是,如果您确实遇到困难,请进行澄清,如果需要,我会添加更多详细信息。
我想向Head类添加一个布尔字段,该字段使该组件使用MouseListener侦听鼠标事件。
这不太难,让我们逐步完成。 在Head
类中添加一个boolean
字段很简单-您只需声明boolean isClosed = false;
-表示您在将字段设置为false
的情况下开始执行,之后您的代码将其解释为使眼睛睁开的指令。
您的核心要求是MouseListener
。 如果还没有,请查看Java Trail中的事件 ; 它说明了如何实现简单的MouseListener
。 此时,请注意, MouseListener
是一个接口,因此,即使它们是空方法,您也必须为其所有方法提供实现。 您可能需要检出MouseAdapter抽象类 。 它提供了所有这些方法(以及更多方法)的空实现,因此您只需要覆盖所需的方法即可-这使您的代码更整洁,因为您没有一堆空方法只能满足编译器的要求。 这将解决我相信您在说“ 并使其余三个方法la脚的鸭子 ”时所指的问题。当然,由于您已经在扩展JPanel,因此无法扩展MouseAdapter
,因此这并不适用这里。 但这(与其他适配器)是一个有用的类,供以后记住。
从那里,我想使用两种方法将此字段设置为true / false
如果我理解正确,那么您想要的是在单击鼠标时切换isClosed
的值。 因此,现在,您有一个MouseListener
/ MouseAdapter
并没有真正执行任何操作。 接下来需要做的就是为MouseClicked()
方法提供一个实现,您可以在其中切换boolean
字段的值。 这也很容易-您只需使用!
反转当前值即可!
(NOT)运算符并将其分配回变量isClosed = !isClosed;
。 您可能希望更详细地阅读Java中的运算符 。
另外,我将如何更改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.