天天看点

java核心技术卷 之JFrame

        JFrame的结构相当复杂。在图中给出了JFrame的结构。可以看到,在JFrame中有四层面板。其中的根面板、层级面板和玻璃面板人们并不关心;它们是用来组织菜单栏和内容窗格以及实现观感的,Swing程序员最关心的是内容窗格(content pane)。在设计框架的 时候,要使用下列代码将所有的组件添加到内容窗格中:

Container contentPane = frane.getContentPane();

Component c =....; 

contentPane.add(c);

java核心技术卷 之JFrame

        将一个绘制消息的组件添加到框架中。绘制一个组件,需要定义一个扩展 JComponent的类,并覆盖其中的paintComponent方法。

        paintComponent方法有一个Graphics类型的参数,这个参数保存着用于绘制图像和文本的设置,例如,设置的字体或当前的颜色。在Java中,所有的绘制都必须使用Graphics对象,其中包含了绘制图案、图像和文本的方法。

下列代码给出了如何创建一个能够进行绘制的组件:

class MyCompoent extends JComponent{
public void paintComponent(Graphics g){
code for drawing
}
}

        无论何种原,只要窗口需要重新绘图,事件处理器就会通告组件,从而引发执行所有组件的paintComponent方法。

显示文本是一种特殊的绘图。在Graphics类中有一个drawString方法,调用的语法格式为:

g.drawString(text f x , y)

         在这里,打算在原始窗口大约水平1/4,垂直1/2的位置显示字符串‚ Not a Hello, World program‛。现在,尽管不知道应该如何度量这个字符串的大小,但可以将字符串的开始位置定义在坐标(75, 100)。这就意味着字符串中的第一个字符位于从左向右75个像素,从上向下100个像素的位置(实际上,文本的基线位于像素100的位置)因此,paintComponent方法的书写内容如下所示:

class NotHelloWorldComponent extends JConponent {

public static final int MESSAGEJ = 75; 

public static final int MESSACE.Y = 100; 

public void paintComponent(Graphics g)

 {

g.drawString(lfNot a Hello, World progra«,,f MESSACEJ, MESSAGE J);
}

}

最后,组件要告诉用户它应该有多大。覆盖gePreferredSize方法。返冋一个有首选宽度和高度的Dimension类对象:

class NotHelloWorldComponent extends JComponent {

private static final int DEFAULT一WIDTH = 300; 

private static final int DEFAULT—HEIGHT = 200; 

public Dimension getPreferredSizeQ { return new Dimension(DEFAULT.WIDTHf OEFAULLHEICHT); }

}

在框架中填人一个或多个组件时,如果你只想使用它们的首选大小,可以调用pack方法而不是setSize方法:

class NotHelloWoridFrame extends JFrame {

public NotHelloWorldFrane()

{

        add(new NotHelloWorldComponent());

}

}

程序代码:

import javax.swing.*;
import java.awt.*;

/**
 * Created by IBM on 2017/9/8.
 */
public class NotHelloWorld {
     public static void main(String[] args){
         EventQueue.invokeLater(new Runnable() {
             @Override
             public void run() {
                 JFrame frame=new NotHelloWorld().new NotHelloWorldFrame();
                 frame.setTitle("NotHelloWorld");
                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                 frame.setVisible(true);
             }
         });
     }
     class NotHelloWorldFrame extends JFrame{
         public NotHelloWorldFrame(){
             add(new NotHelloWorldCompponent());
             pack();
         }
     }
     class NotHelloWorldCompponent extends JComponent{
         public static final int MESSAGE_X=75;
         public static final int MESSAGE_Y=100;

         private static final int DEFAULT_WIDTH=300;
         private static final int DEFAULT_HEIGHT=200;
         public void paintComponent(Graphics g){
             g.drawString("not a hello world program",MESSAGE_X,MESSAGE_Y);
         }
         public Dimension getPreferredSize(){return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);}
     }
}      

运行结果:

java核心技术卷 之JFrame

java.awt.Component 1.0

• void repaint()

 “尽可能快地”重新绘制组件。

• Dimension getPreferredSize()

要覆盖这个方法,返回这个组件的首选大小 

javax,swing.JComponent 1.2

• void paintComponent(Grphics g)

覆盖这个方法来描述应该如何绘制自己的组件 

java.awt. Window 1.0

• void pack()

调整窗口大小,要考虑到其组件的首选大小