JFrame的结构相当复杂。在图中给出了JFrame的结构。可以看到,在JFrame中有四层面板。其中的根面板、层级面板和玻璃面板人们并不关心;它们是用来组织菜单栏和内容窗格以及实现观感的,Swing程序员最关心的是内容窗格(content pane)。在设计框架的 时候,要使用下列代码将所有的组件添加到内容窗格中:
Container contentPane = frane.getContentPane();
Component c =....;
contentPane.add(c);
将一个绘制消息的组件添加到框架中。绘制一个组件,需要定义一个扩展 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.awt.Component 1.0
• void repaint()
“尽可能快地”重新绘制组件。
• Dimension getPreferredSize()
要覆盖这个方法,返回这个组件的首选大小
javax,swing.JComponent 1.2
• void paintComponent(Grphics g)
覆盖这个方法来描述应该如何绘制自己的组件
java.awt. Window 1.0
• void pack()
调整窗口大小,要考虑到其组件的首选大小