2016-04-21 145 views
-1

这是我的第一个问题,所以如果我犯了错误,请道歉。 试图更好地理解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); 
    } 
} 

}

+1

如果您的目标是学习java中的面向对象设计(包括多态性和继承),我会阅读Cay概念:早期对象Cay Horstmann – dustinroepsch

+0

阅读分解成想法/想法的文章要容易得多。当事情更容易阅读时,更容易获得帮助。 – ChiefTwoPencils

回答

0

矩形对象的涂料成份不执行

所有你做的是设置在JPanel的一个领域,你是不是改变JPanel本身。我怀疑你的意图是删除椭圆形并添加矩形。

0

你的OOP是健全的;你的Swing不是。

您从shape开始设置为您的oval。这个形状被添加到你的JPanel中。该矩形从未添加到JPanel。即使你设置了shape = rectangle,然后告诉它绘制,Swing知道你的rectangle没有父组件,因此永远不会绘制。所以告诉它repaint()不是请致电paintComponent()