JFrame的目标实例继承了类

时间:2016-12-20 15:28:09

标签: java swing

我对使用JFrame s

有疑问

(来源1)

import javax.swing.*;  

public class FirstSwingExample {
    public static void main(String[] args) {
        JFrame f = new JFrame();// creating instance of JFrame

        JButton b = new JButton("click");// creating instance of JButton
        b.setBounds(130, 100, 100, 40);// x axis, y axis, width, height

        f.add(b);// adding button in JFrame

        f.setSize(400, 500);// 400 width and 500 height
        f.setLayout(null);// using no layout managers
        f.setVisible(true);// making the frame visible
    }
}

(来源2)

import javax.swing.JButton;
import javax.swing.JFrame;


class FrameTest extends JFrame {
    public FrameTest() {
        JButton b=new JButton("click");//create button  
        b.setBounds(130,100,100, 40);  

        add(b);//adding button on frame  
        setSize(400,500);  
        setLayout(null);  
        setVisible(true);  
    }
}

public class Appl {  

    public static void main(String[] args) {  
          new FrameTest();
    }  
}

我的问题是:

源代码1中的

- .add,.setSize,.setLayout和.setVisible是' f'的实例方法。 那些方法初始化' f'。

的属性

但是在source2中 - add,setSize,setLayout和setVisible是某个超类的方法。

在这个源代码中,没有任何JFrame实例。然而它只是没有问题。

我无法理解。我发现了Container.class和JFrame.class,Frame.class但是我找不到创建JFrame实例的部分。

1 个答案:

答案 0 :(得分:4)

  

在这个源代码中,没有任何JFrame实例

这是不正确的假设。在第二个代码库中,当前实例this原样是一个JFrame对象。您在致电new FrameTest()时创建实例。由于FrameTest继承自JFrame,因此所有实例都将是JFrame的子代。

其他无关的问题:

  • 虽然null布局和setBounds()可能看起来像创建复杂GUI的最简单和最好的方式,但是你创建的Swing GUI越多,使用它们时会遇到更严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕
  • 您通常不希望创建扩展JFrame的类,因为在这样做时,您需要创建和显示JFrame,这通常需要更多的灵活性。事实上,我冒昧地说,我创建的大部分Swing GUI代码和我见过的扩展了JFrame,事实上你很少想做这个。更常见的是,您的GUI类将面向创建JPanels,然后可以将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。