這是我的第一個問題,所以如果我犯了錯誤,請道歉。 試圖更好地理解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