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