这是我的第一个问题,所以如果我犯了错误,请道歉。 试图更好地理解oop(inheritance,polymorphism,abstractization)我想象下面的练习:在带有BorderLayout的JPanel中,我添加一个JPanel,其中包含两个JRadioButton和一个扩展JPanel的抽象面板。抽象面板可以指向2个不同的具体的孩子......但它不像我预期的那样工作。 。当我选择控制台上的矩形按钮打印“矩形火灾事件”,但矩形对象的涂料组件未执行,当我在控制台上选择椭圆形按钮打印“椭圆形火灾事件”和“绘制椭圆形绘制椭圆形“这意味着椭圆形按钮的绘画组件被执行。请帮我理解我做错了什么?为什么矩形的paintComponent不被执行? 我再说一遍,我的目的是练习和理解oop,而不是绘制椭圆和矩形。 这里是我的代码java继承和多态性
public class MyGeometry extends JPanel{
private MyShape shape;
private JPanel shapeControl = new JPanel();
private JRadioButton rbtOval = new JRadioButton("Oval");
private JRadioButton rbtRectangle = new JRadioButton("Rectangle");
MyGeometry(){
setLayout(new BorderLayout());
// setting radio buttons
ButtonGroup shapeButton = new ButtonGroup();
shapeButton.add(rbtOval);
shapeButton.add(rbtRectangle);
rbtOval.setSelected(true);
shapeControl.add(rbtOval);
shapeControl.add(rbtRectangle);
//Initialize shape to avoid null pointer exception
final MyOval oval = new MyOval();
final MyRectangle rectangle = new MyRectangle();
shape = oval;
//add components to the panel
add(shapeControl, BorderLayout.NORTH);
add(shape);
//add event handling
rbtOval.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
shape = oval;
shape.repaint();
System.out.println("Oval fires event");
}
});
rbtRectangle.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
shape = rectangle;
shape.repaint();
System.out.println("Rectangle fires event");
}
});
}
public Dimension getPreferredSize(){
return new Dimension(500, 500);
}
public abstract class MyShape extends JPanel{
public abstract String dummyString();
public void paintComponent(Graphics g){
super.paintComponent(g);
}
}
public class MyOval extends MyShape{
public String dummyString(){
return "Draw oval";
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawOval(50, 50, 100, 80);
String textOval = "paint oval " + dummyString();
System.out.println(textOval);
}
}
public class MyRectangle extends MyShape{
public String dummyString(){
return "Draw rectangle";
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawRect(50, 50, 100, 80);
String textRectangle = "paint rectangle " + dummyString();
System.out.println(textRectangle);
}
}
}
如果您的目标是学习java中的面向对象设计(包括多态性和继承),我会阅读Cay概念:早期对象Cay Horstmann – dustinroepsch
阅读分解成想法/想法的文章要容易得多。当事情更容易阅读时,更容易获得帮助。 – ChiefTwoPencils