继承是java的一大特性,主要的实现方式是extends,使用extends时需要注意只能继承一个类,即extends后面只能接一个类名。继承者称为子类,被继承者称为父类,子类含有父类允许的所有属性。另外,若不用extends,想要调用其他类的方法,则需要注意,其他类中方法前有加public的可以继承,但有private的不能继承。
继承相当于是子类对于父类的扩展,是一种详细的描述,如男人属于人,那么人是父类,男人是子类。由此我们可以想到button和panel的扩展。
button是父类,它的作用是模糊的,那么我们可以根据button的作用来扩展,如做一个开关按钮,初始时为关闭状态,我们定义为“0”。按一下button改变一次状态,button的状态在“0”和“1”之间转换。
import java.awt.*;
import java.awt.event.*;
//bool按钮
public class BoolButton extends Button
{
public void labelInit()
{
setLabel("0");
}
public void BoolButton()
{
this.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(getLabel().contains("0"))
setLabel("1");
else if(getLabel().contains("1"))
setLabel("0");
}
});
}
}
以上是创建的BoolButton类,其继承了button类的属性,拥有上述所说的特点。
再来创建另外一个button的子类,根据作用,我们想要按一下按钮退出窗口,那么就做一个Exit按钮,用来退出程序。
import java.awt.*;
import java.awt.event.*;
//exit按钮
public class ExitButton extends Button
{
public void labelInit()
{
setLabel("Exit");
}
public void ExitButton()
{
this.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}
}
有了这两种例子,其他功能的按钮也能照样做出来。
接下来是panel的继承。
想做一个画板,上面就简单地画一个灯,让它与之前的bool按钮相联系,当按钮状态为“0”时,灯为红色;按钮状态为“1”时,灯为绿色。
import java.awt.*;
import java.awt.event.*;
public class DrawPanel extends Panel
{
static int feature = 0;
public void changeFeature()
{
if(feature == 1)
feature = 0;
else
feature = 1;
}
public void paint(Graphics g)
{
super.paint(g);
if(feature == 0)
{
g.setColor(Color.red);
}
else
{
g.setColor(Color.green);
}
g.fillRoundRect(50,50,100,100,12,12);
}
public void drawPanel()
{
setSize(200,200);
}
}
改变状态的关键在于参数feature,我们在别的类中调用changeFeature方法可以改变画板的选用颜色。
最后是将这些按钮和画板整合到一起,我们再创建一个frame的子类,用来放置按钮和画板。
import java.awt.*;
import java.awt.event.*;
public class MyFrame extends Frame implements ActionListener
{
BoolButton boolButton = new BoolButton();
ExitButton exitButton = new ExitButton();
DrawPanel drawPanel = new DrawPanel();
Panel panel = new Panel();
public MyFrame()
{
boolButton.labelInit();
exitButton.labelInit();
boolButton.BoolButton();
exitButton.ExitButton();
boolButton.addActionListener(this);
this.setLayout(new GridLayout(2,1));
panel.setLayout(null);
drawPanel.setLayout(null);
boolButton.setBounds(50,50,100,100);
exitButton.setBounds(300,50,100,100);
panel.add(boolButton);
panel.add(exitButton);
add(drawPanel);
add(panel);
}
public void actionPerformed(ActionEvent e)
{
drawPanel.changeFeature();
drawPanel.repaint();
}
public static void main(String[] args)
{
MyFrame frame = new MyFrame();
frame.setTitle("颜色转换按钮和退出按钮");
frame.setResizable(false);
frame.setSize(500,500);
frame.setVisible(true);
}
}
由于paint方法绘制图形不会马上刷新,需要最小化再打开才能生效,那我们需要在按下按钮的瞬间让灯的颜色改变则需要用到repaint方法。在这里repaint方法使用只用于画板,所以加上画板变量名drawPanel,若不加则和原来一样。