我写了一个小的Swing程序,它绘制了一个头部,当用户选择/取消选择JCheckBox实例时,会从头顶部绘制或移除帽子。我在使用这个程序的下一步时遇到了一些麻烦 - 我想在Head类中添加一个布尔字段,使该组件使用MouseListener监听鼠标事件。从那里开始,我想使用两种方法将此字段设置为true / false,并将其余三种方法设置为lame ducks。另外,我如何更改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());
}
}
答案 0 :(得分:0)
我故意在这里有点模糊,因为我不确定这是否是家庭作业,因为你已经有相当数量的代码可以做很多与你想要的非常相似的东西它和修改它应该不是很困难。但是,如果您实际上遇到困难,请澄清,如果需要,我会添加更多详细信息。
我想在Head类中添加一个布尔字段,使该组件使用MouseListener监听鼠标事件。
这不是太难,让我们来看看吧。向boolean
类添加Head
字段非常简单 - 只需声明boolean isClosed = false;
- 表示您开始执行时将字段设置为false
,您的代码将在以后执行解释为睁眼的指示。
您的核心要求是MouseListener
。如果您还没有,请查看the Java Trail for events;它解释了如何实现简单的MouseListener
。此时,请注意MouseListener
是一个接口,因此,您必须为其所有方法提供实现,即使它们是空体方法。您可以查看the MouseAdapter abstract class。它提供了所有这些方法的空实现(以及更多),因此您只需要覆盖您需要的那些 - 这使您的代码更清晰,因为您没有一堆空方法只是为了满足编译器。当你说“并渲染其余三种方法时,跛脚鸭”时,这就解决了我认为你所指的问题。当然,既然你已经扩展了JPanel,你就无法扩展{{ 1}}所以这不适用于此。但是这个(和其他适配器一起)是一个有用的课程,以备日后使用。
从那里开始,我想使用两种方法将此字段设置为true / false
如果我理解正确,您想要的是在鼠标点击时切换MouseAdapter
的值。所以现在,你有isClosed
/ MouseListener
并没有真正做任何事情。您接下来要做的是为MouseAdapter
方法提供一个实现,让您切换MouseClicked()
字段的值。这也很简单 - 您只需使用boolean
(NOT)运算符反转当前值,并将其赋值给变量 - !
。您可能希望阅读operators in Java in more detail。
另外,我如何更改paintComponent方法,以便如果布尔值为true,则用睁开的眼睛绘制对象,如果它是假的,则在闭眼时绘制头部?
这样做的一种方法是为两只闭眼创造两个以上的形状,类似于你睁眼的那些。一旦你完成了这个,就可以根据isClosed = !isClosed;
的值决定绘制哪些(即闭眼或开眼)。因此,您可以使用if
clause检查isClosed
的值,并在isClosed
时睁开眼睛,在false
时睁开眼睛。请注意,由于您的点击处理程序正在修改true
的值,因此您需要确保在更改值时调用isClosed
,否则Swing可能不会立即更新面板以显示更改然后你就不会发现任何事情。
总结一下,实现目标的一种方法是对repaint()
进行以下修改:
Head