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()
調整視窗大小,要考慮到其元件的首選大小