天天看點

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()

調整視窗大小,要考慮到其元件的首選大小