2016-04-21 102 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()