java语言不是不支持多继承吗,这里已经继承了JFrame类,不是靠只能实现Runnable接口来创建线程吗?
java语言不是不支持多继承吗,这里已经继承了JFrame类,不是靠只能实现Runnable接口来创建线程吗?这里的匿名内部类并没有实现Runnable接口啊...
java语言不是不支持多继承吗,这里已经继承了JFrame类,不是靠只能实现Runnable接口来创建线程吗?这里的匿名内部类并没有实现Runnable接口啊
展开
4个回答
展开全部
首先,不一定需要继承JFrame类,但是继承JFrame类更方便,更容易操作
补充:
不继承JFrame类:
import javax.swing.*;
public class Demo
{
public Demo()
{
JFrame jf=new JFrame("不继承JFrame的窗口");
jf.setBounds(300, 300, 500, 500);
jf.setVisible(true);
}
public static void main(String[] args)
{
Demo d=new Demo();
}
}
补充:
继承JFrame类:
import javax.swing.*;
public class Demo extends JFrame
{
public Demo()
{
this.setTitle("继承JFrame的窗口");
this.setBounds(300, 300, 500, 500);
this.setVisible(true);
}
public static void main(String[] args)
{
Demo d=new Demo();
}
}
界面设计用Swing,事件监测用awt。JFrame是一个大框架。一般在使用时,我们将自己的主类继承JFrame。
public class review_jpanel extends JFrame{
//JPanel mypanel = new JPanel();
static int frame_w = 300;
static int frame_h = 200;
public static void main(String[] args){
review_jpanel test = new review_jpanel();
}
public review_jpanel(){
this.setTitle("review jpanel");
this.setSize(frame_w, frame_h);
this.setLocation(200, 300);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
MyPanel mypanel = new MyPanel();
this.add(mypanel);
Thread xc3 = new Thread(mypanel);
xc3.start();
}
}
在JFrame初始化中,我们需要设置宽度,高度,标题,窗口可伸缩,关闭释放资源(setDefaultCloseOperation,这个一定要加上!),可见。初始化完成后,我们可以在里面添加控件,例如JLabel,JButton,可以进行简单的布局(比较简单,不详细说明)。
JPanel是一个画板,我们可以在上面画图形,(圆,直线,矩形,等等),它只是一个画板,我们要把它添加到我们的JFrame里面去。一般我们自己定义一个类如mypanel,用它继承JPanel。因为如果直接使用类JPanel有很多操作难以完成(例如在JPanel加入监听事件,加入线程)。
class MyPanel extends JPanel implements Runnable{
line myline = new line();
public MyPanel(){
super.paint(null);
Thread xc1 = new Thread(myline);
xc1.start();
}
public void paint(Graphics g){
super.paint(g);
//g.drawLine(this.myline.x, this.myline.y, 230, 320);
g.drawOval(10,10,this.myline.x,this.myline.y);
}
public void run(){
//while(true){
try{
Thread.sleep(10);
}
catch(Exception d){}
this.repaint();
System.out.println("+1\n");
Thread xc4 = new Thread(this);
xc4.start();
//}
}
}
继承了JPanel后,我们要在MyPanel类中,重载paint方法。(方法名不是我取的,参数也不是我取的,都是固定的,记住就行。参数g类似于画笔,它有很多方法)。可以把paint方法理解为你要jpanel去做什么,要它画什么东西,怎么画。
线程,具体的定义以及和进程的区别不是主要的内容,这里主要讲在JPanel中直观的将线程表现出来,比那些理论更容易接受。所谓线程,在我理解就是让一个实例拥有了“运动”的属性,这也就是为什么线程中核心就是run方法。什么叫做“运动”的属性呢?假设我们自己定义一个类,一个矩形类,它的元素有起点坐标,长度,宽度。然后我们在JPanel中将它画出来,它就是一个死的矩形,不会运动,长度,宽度,颜色,位置都不会变。
现在我们赋予它“运动”的属性,(容易理解开启线程时在类的后面需要实现Runnable)让它实现Runnable这个接口。现在它就是可以运动了,那么怎么运动呢?我们还需要重写run方法,告诉它怎么运动。具体例子如下
class line implements Runnable{
int x=0,y=0;
public void run(){
this.x+=10;
this.y+=10;
try{
Thread.sleep(1000);
}
catch(Exception d){}
Thread xc= new Thread(this);
xc.start();
}
}
很简单的一个类,直线类,由于是测试线程,这里只改变它的x和y。在run方法中,我们让x+10,y+10,延迟1秒之后开启本次线程。然后在MyPanel中,开启此类实例化的myline的线程。在JFrame中,开启JPanel的线程。(myline在JPanel中,JPanel镶嵌在JFrame中,全部都要开启线程)。将上面的程序编译后就可以看到一个一秒钟半径改变一次的圆,直观的看到这个圆是可以运动的。
注:
1.让JPanel不断的画圆,除了程序中在run方法中调用repaint方法,然后重新开始此线程,还可以使用我们学51时的while(true)语句,也就是一直重载run方法
2.run方法中的延时方法需要使用抛异常处理(系统这么规定,记住就行)
3.由程序可以看出,开启线程时一般书写习惯在构造方法中开启。
希望可以帮到你,可以一起相互交流交流!!!
补充:
不继承JFrame类:
import javax.swing.*;
public class Demo
{
public Demo()
{
JFrame jf=new JFrame("不继承JFrame的窗口");
jf.setBounds(300, 300, 500, 500);
jf.setVisible(true);
}
public static void main(String[] args)
{
Demo d=new Demo();
}
}
补充:
继承JFrame类:
import javax.swing.*;
public class Demo extends JFrame
{
public Demo()
{
this.setTitle("继承JFrame的窗口");
this.setBounds(300, 300, 500, 500);
this.setVisible(true);
}
public static void main(String[] args)
{
Demo d=new Demo();
}
}
界面设计用Swing,事件监测用awt。JFrame是一个大框架。一般在使用时,我们将自己的主类继承JFrame。
public class review_jpanel extends JFrame{
//JPanel mypanel = new JPanel();
static int frame_w = 300;
static int frame_h = 200;
public static void main(String[] args){
review_jpanel test = new review_jpanel();
}
public review_jpanel(){
this.setTitle("review jpanel");
this.setSize(frame_w, frame_h);
this.setLocation(200, 300);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
MyPanel mypanel = new MyPanel();
this.add(mypanel);
Thread xc3 = new Thread(mypanel);
xc3.start();
}
}
在JFrame初始化中,我们需要设置宽度,高度,标题,窗口可伸缩,关闭释放资源(setDefaultCloseOperation,这个一定要加上!),可见。初始化完成后,我们可以在里面添加控件,例如JLabel,JButton,可以进行简单的布局(比较简单,不详细说明)。
JPanel是一个画板,我们可以在上面画图形,(圆,直线,矩形,等等),它只是一个画板,我们要把它添加到我们的JFrame里面去。一般我们自己定义一个类如mypanel,用它继承JPanel。因为如果直接使用类JPanel有很多操作难以完成(例如在JPanel加入监听事件,加入线程)。
class MyPanel extends JPanel implements Runnable{
line myline = new line();
public MyPanel(){
super.paint(null);
Thread xc1 = new Thread(myline);
xc1.start();
}
public void paint(Graphics g){
super.paint(g);
//g.drawLine(this.myline.x, this.myline.y, 230, 320);
g.drawOval(10,10,this.myline.x,this.myline.y);
}
public void run(){
//while(true){
try{
Thread.sleep(10);
}
catch(Exception d){}
this.repaint();
System.out.println("+1\n");
Thread xc4 = new Thread(this);
xc4.start();
//}
}
}
继承了JPanel后,我们要在MyPanel类中,重载paint方法。(方法名不是我取的,参数也不是我取的,都是固定的,记住就行。参数g类似于画笔,它有很多方法)。可以把paint方法理解为你要jpanel去做什么,要它画什么东西,怎么画。
线程,具体的定义以及和进程的区别不是主要的内容,这里主要讲在JPanel中直观的将线程表现出来,比那些理论更容易接受。所谓线程,在我理解就是让一个实例拥有了“运动”的属性,这也就是为什么线程中核心就是run方法。什么叫做“运动”的属性呢?假设我们自己定义一个类,一个矩形类,它的元素有起点坐标,长度,宽度。然后我们在JPanel中将它画出来,它就是一个死的矩形,不会运动,长度,宽度,颜色,位置都不会变。
现在我们赋予它“运动”的属性,(容易理解开启线程时在类的后面需要实现Runnable)让它实现Runnable这个接口。现在它就是可以运动了,那么怎么运动呢?我们还需要重写run方法,告诉它怎么运动。具体例子如下
class line implements Runnable{
int x=0,y=0;
public void run(){
this.x+=10;
this.y+=10;
try{
Thread.sleep(1000);
}
catch(Exception d){}
Thread xc= new Thread(this);
xc.start();
}
}
很简单的一个类,直线类,由于是测试线程,这里只改变它的x和y。在run方法中,我们让x+10,y+10,延迟1秒之后开启本次线程。然后在MyPanel中,开启此类实例化的myline的线程。在JFrame中,开启JPanel的线程。(myline在JPanel中,JPanel镶嵌在JFrame中,全部都要开启线程)。将上面的程序编译后就可以看到一个一秒钟半径改变一次的圆,直观的看到这个圆是可以运动的。
注:
1.让JPanel不断的画圆,除了程序中在run方法中调用repaint方法,然后重新开始此线程,还可以使用我们学51时的while(true)语句,也就是一直重载run方法
2.run方法中的延时方法需要使用抛异常处理(系统这么规定,记住就行)
3.由程序可以看出,开启线程时一般书写习惯在构造方法中开启。
希望可以帮到你,可以一起相互交流交流!!!
追问
可这里并不是实现多接口,我奇怪就奇怪在这里,如果是实现接口,我可以理解,可这里却是继承Thread类,继承了JFrame,怎么还能继承Thread类呢?
展开全部
不支持多继承是不能继承多个父类。 而接口不是类,java可以实现多接口。
你可以这样理解,继承类,会继承类的方法。
而实现接口,所有的方法是需要你重构的
你可以这样理解,继承类,会继承类的方法。
而实现接口,所有的方法是需要你重构的
追问
可这里并不是实现多接口,我奇怪就奇怪在这里,如果是实现接口,我可以理解,可这里却是继承Thread类,继承了JFrame,怎么还能继承Thread类呢?
追答
你理解错了。 这个代码只是在内部做了一个匿名类去继承thread。本身没有继承thread。
这个匿名类只是里面的一个成员变量。
你这样理解一下。
Class B 继承了Thread。
Class A 继承了 JFrame。 而且A里有个成员 B b 。
只是由于B只用一次。所以简化的写法是吧B的定义放在A里,连B的名称都省略了。 这个就叫做匿名类。
你可以在网上再查一下匿名类的说明
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
匿名内部类是不同于InterrupedSwing类的另外一个类,它也可以继承一个超类,这里就是让匿名内部类继承Thread类。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
InterruptedSwing继承了JFrame类关thread什么事?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询