1. 程式人生 > >Java Swing 應用簡介——以溫度顯示介面為例

Java Swing 應用簡介——以溫度顯示介面為例

在Java中使用Swing來設計圖形使用者介面(GUI),使用Swing開發的Java應用程式,介面不受本地系統的限制,移植到其他平臺上介面不會改變。

Swing的基本器件包括窗體(JFrame),面板(JPanel),元件(標籤,列表,按鈕……),我們可以可以這樣理解三者間的關係:GUI就像一張桌子擺滿了豐盛食物,JFrame就是這張桌子,元件就是桌子上不同的食物,而JPanel就是擺放這些食物的餐具。餐具的意義是使紛繁複雜的“食物”擺放的井然有序,JPanel起到同樣的作用。

擺放井然有序的桌面

Swing基本器件之間的關係

窗體

JFrame 架構窗體是一個容器,是Swing程式中各個組建的載體,可以將JFrame看作是承載這些Swing元件的容器。在開發應用程式時可以通過繼承java.swing.JFrame 類建立一個窗體,在這個窗體中新增組建,同時為元件設定事件。由於該窗體繼承了JFrame類,所以它擁有一些最大化、最小化、關閉的按鈕。

JDialog窗體是Swing元件中的對話方塊,功能是從一個窗體彈出另一個窗體。JDialog窗體實質上就是另一種型別的窗體,它與JFrame窗體類似,JDialog窗體在使用時需要呼叫getContentPane()方法將窗體轉換為容器,然後在容器中設定窗體的特性。

面板

面板是一個Swing容器,它可以作為容器容納其他元件,但必須被新增到其他容器中。Swing常用的面板包括JPanel面板和JScrollPane面板。

JPanel面板可以聚集一些元件來佈局,在設定介面時,可能會遇到在一個較小的容器中顯示一個較大部分的內容,這時可以使用JScrollPane面板。JScrollPane面板是帶滾動條的面板,它也是一種容器,但是JScrollPane只能放置一個元件,並且不可以使用佈局管理器。如果需要在JScrollPane面板中放置多個元件,需要將多個元件放置在JPanel面板上,然後將JPanel面板作為一個整體元件新增在JScrollPane面板上。

標籤元件與圖示

標籤由JLabel類定義,它的父類為JComponent類。標籤可以顯示一行只讀文字、一個影象或者帶影象的文字,它不產生任何型別的事件,只是簡單地顯示文字和圖片。

按鈕元件

按鈕在Swing中是較為常見的元件,它用於出發特定動作。Swing中提交按鈕由JButton物件表示,單選按鈕元件由JRadioButton物件表示,複選框有JCheckBox類物件表示,

列表元件

Swing中提供了下拉列表框與列表框兩種列表元件。下拉列表使用JComboBox類物件表示。列表框由JList類物件表示。

文字框元件

文字框又來顯示或編輯一個單行文字,在Swing中通過JTextField類物件建立。

除此之外,還有密碼框元件,文字域元件,表格元件,樹元件等等。

下面我們以溫度顯示介面的應用來演示各個部分的用法:

WindowMunu類及main()方法

public class WindowMenu {     public static void main(String[] args) {         // TODO Auto-generated method stub         int frameWidth = 800;  //frame寬度         int frameHeight = 800; //frame高度         int[] highTemperature = {28,27,32,30,31,27,27,27,28,28}; // 最高氣溫列表         int[] lowTemperature = {19,19,19,18,20,18,16,15,16,19};  // 最低氣溫列表         /*          * JFrame 介面設定          */         JFrame windowmenu=new JFrame("溫度顯示介面");         windowmenu.setVisible(true);         windowmenu.setSize(frameWidth,frameHeight);             Toolkit kit = Toolkit.getDefaultToolkit(); //定義工具包         Dimension screenSize = kit.getScreenSize(); //獲取螢幕的尺寸         int screenWidth = screenSize.width; //獲取螢幕的寬         int screenHeight = screenSize.height; //獲取螢幕的高         windowmenu.setLocation(screenWidth/2-frameWidth/2, screenHeight/2-frameHeight/2);//設定視窗居中顯示         windowmenu.setResizable(false);         windowmenu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                 /*          * Panel1 格式設定          */         textLabel label10 = new textLabel("當天最高溫度",Color.BLACK,40);         textLabel label11 = new textLabel("°C",Color.BLACK,40);         numLabel label13 = new numLabel(String.valueOf(highTemperature[highTemperature.length-1]),Color.RED,50);         JPanel mypanel1 = new JPanel();         mypanel1.setLayout(new GridLayout(1,3,1,1));         mypanel1.add(label10);         mypanel1.add(label13);         mypanel1.add(label11);             /*          * Panel2 格式設定          */         textLabel label20 = new textLabel("當天最低溫度",Color.BLACK,40);         textLabel label21 = new textLabel("°C",Color.BLACK,40);         numLabel label23 = new numLabel(String.valueOf(lowTemperature[lowTemperature.length-1]),Color.BLUE,50);         JPanel mypanel2 = new JPanel();         mypanel2.setLayout(new GridLayout(1,2,1,1));         mypanel2.add(label20);         mypanel2.add(label23);         mypanel2.add(label21);         /*          * Panel3格式設定          * 將Panel1和Panel2放在一起構成Panel3          */         JPanel mypanel3 = new JPanel();         mypanel3.setLayout(new GridLayout(2,1,1,1));         mypanel3.add(mypanel1);         mypanel3.add(mypanel2);             /*          * Panel4格式設定          * 在Panel4中放置歷史溫度曲線          */         JPanel mypanel4 = new JPanel();         mypanel4.setLayout(new GridLayout(1,1,1,1));         DrawPicture picture = new DrawPicture(frameWidth,frameHeight,highTemperature,lowTemperature);         // 將Fram的尺寸作為picture尺寸的參考         mypanel4.add(picture);         /*          *溫度顯示佈局          */         windowmenu.setLayout(new GridLayout(0,1,5,5));         windowmenu.add(mypanel3);         windowmenu.add(mypanel4);     } }

textLabel類

/*  * 繪製標籤類  */ public class textLabel extends JLabel {     private String str; //字串     private Color color; //標籤顏色     private int fontSize; //字型大小     public textLabel(){     }     public textLabel(String s, Color c, int f){         this.str = s;         this.color = c;         this.fontSize = f;         setText(str);         setFont(new Font(null,Font.PLAIN,fontSize));         setBackground(Color.BLACK);         setForeground(color);     } }

numLabel類

/*  * 顯示數值類  */ public class numLabel extends JLabel {     private String str; // 需要顯示的字串     private Color color; //字型顏色     private int fontSize; //字型大小     //private String icon;          public numLabel(){     }     public numLabel(String s, Color c, int f){         this.str = s;         this.color = c;         this.fontSize = f;         //this.icon = "timg.jpg";         // JLabel label = new JLabel("°C",JLabel.CENTER);         setText(str);         setFont(new Font(null,Font.PLAIN,fontSize));         setBackground(Color.BLACK);         setForeground(color);         // setIcon(new ImageIcon(icon));     } }

DrawPicture類

/*  * 繪製溫度歷史曲線類  */ public class DrawPicture extends JPanel{     private int width; //JFrame面板寬度     private int height; //JFrame面板高度     private int offSet = 50; //位置偏置     private int[] highTemperature;// {28,27,32,30,31,27,27,27,28,28};     private int[] lowTemperature;// {19,19,19,18,20,18,16,15,16,19};     public DrawPicture(){              }     public DrawPicture(int w,int h,int[] hT, int[] lT){         this.width = w;         this.height = h;         this.highTemperature = hT;         this.lowTemperature = lT;     }     public void paint(Graphics g) {     super.paint(g);     g.setColor(Color.BLACK);     g.setFont(new Font(null,Font.BOLD,30));          g.drawLine(offSet, height/2-offSet, width-offSet, height/2-offSet); // x軸     g.drawLine(offSet, height/2-offSet, offSet, 0); //y軸     g.drawString("歷史溫度曲線", width/2-2*offSet, height/2-2*offSet);     for(int i=0;i<9;i++){         g.setColor(Color.RED);         g.setFont(new Font(null,Font.BOLD,30));         g.drawLine(i*70+50,300-highTemperature[i]*8,(i+1)*70+50,300-highTemperature[i+1]*8);     }     for(int i=0;i<9;i++){         g.setColor(Color.BLUE);         g.setFont(new Font(null,Font.BOLD,30));         g.drawLine(i*70+50,300-lowTemperature[i]*8,(i+1)*70+50,300-lowTemperature[i+1]*8);     }     } }

輸出結果

2018/9/16