Java基礎——GUI編程(三)

来源:http://www.cnblogs.com/1693977889zz/archive/2017/07/10/7148264.html
-Advertisement-
Play Games

接著前兩篇學習筆記,這篇主要介紹佈局管理器和對話框兩部分內容。 一、佈局管理器 先拿一個小例子來引出話題,就按照我們隨意的添加兩個按鈕來說,會產生什麼樣的效果,看執行結果。 執行結果: 從運行程式中,只看到了第二個按鈕B。 原因是每個組件,在容器中都有一個具體的位置和大小,想在容器中排列組件時很難確 ...


接著前兩篇學習筆記,這篇主要介紹佈局管理器和對話框兩部分內容。

一、佈局管理器

先拿一個小例子來引出話題,就按照我們隨意的添加兩個按鈕來說,會產生什麼樣的效果,看執行結果。

import java.awt.Button;
import java.awt.Frame;

public class Test25 {
    public static void main(String[] args) {
        Frame f = new Frame("佈局管理器");
        f.setSize(300, 400);
        f.add(new Button("按鈕A"));
        f.add(new Button("按鈕B"));
        f.setVisible(true);
    }
}

執行結果:

從運行程式中,只看到了第二個按鈕B。

原因是每個組件,在容器中都有一個具體的位置和大小,想在容器中排列組件時很難確定其位置,為簡化用戶的控制,Java採取佈局管理器進行管理可以為容器指定不同的佈局管理器。

1.BorderLayout (邊界佈局,預設的模式) 將容器分為東南西北中五個區域

  Frame f=new Frame("佈局管理器");
      f.add(new Button("按鈕A"),BorderLayout.NORTH);
      f.add(new Button("按鈕B"));
      f.add(new Button("按鈕C"),"East");
      f.setBounds(20,20,300,300);
      f.setVisible(true);

2. FlowLayout  從左到右,從上到下,如果我們在FlowLayout佈局中加入 "North","East" 之類的參數,將被忽略

Frame f=new Frame("佈局管理器");
    f.setLayout(new FlowLayout() );
    f.add(new Button("按鈕A"),BorderLayout.NORTH);
    f.add(new Button("按鈕B"));
    f.add(new Button("按鈕B"));

3. GridLayout  網格,從左到右,從上到下,該佈局總是忽略組件的最佳大小,所有單元的寬度是相同的

4.CardLayout  選項卡佈局

5.GridBagLayout 佈局之王,功能強大,使用複雜,

6.BoxLayOut  Swing 中新增的一種佈局管理器,允許多個組件全部垂直或水平擺放,嵌套多個該佈局管理器的Panel,可以實現類似

7.GridBagLayout 的功能,但要比使用 GridBagLayOut 簡單的多

比較複雜點的代碼例子(目的是左邊一列三行網格佈局,右邊選項卡佈局,並且左邊的按鈕按下會引發右邊相應變化)

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//佈局的例子
class LayoutTest {
    public LayoutTest() {
        init();
    }

    CardLayout cl = new CardLayout(); // 卡片佈局
    Panel plCenter = new Panel(); // 面板,容器

    private void init() {
        Frame f = new Frame();
        Panel plWest = new Panel();

        plWest.setBackground(Color.pink);
        plCenter.setBackground(Color.DARK_GRAY);

        f.add(plWest, BorderLayout.WEST); // 往左邊放
        f.add(plCenter);

        plWest.setLayout(new GridLayout(3, 1)); // 網格佈局,三行,一列
        Button btnPrev = new Button("前一個");
        Button btnNext = new Button("後一個");
        Button btnThree = new Button("第三個");

        plWest.add(btnPrev);
        plWest.add(btnNext);
        plWest.add(btnThree);

        plCenter.setLayout(cl); // 中間的主面板,設為卡片佈局
        plCenter.add(new Button("A"), "1AAA");
        plCenter.add(new Button("B"), "2AAA");
        plCenter.add(new Button("C"), "3AAA");
        plCenter.add(new Button("D"), "4AAA");
        plCenter.add(new Button("E"), "5AAA");
        plCenter.add(new Button("F"), "6AAA");

        // 用於按鈕事件處理的內部類

        class MyActionListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equals("前一個")) {
                    cl.previous(plCenter);
                } else if (e.getActionCommand().equals("後一個")) {
                    cl.next(plCenter);
                } else if (e.getActionCommand().equals("第三個")) {
                    cl.show(plCenter, "5AAA"); // 指定顯示哪一個
                }

            }
        }

        MyActionListener listener = new MyActionListener();

        btnPrev.addActionListener(listener);
        btnNext.addActionListener(listener);
        btnThree.addActionListener(listener);

        f.setSize(300, 300);
        f.setVisible(true);

        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

}

class Test26 {
    public static void main(String[] args) {
        new LayoutTest();
    }
}

註意:取消佈局管理器(代碼例子如下)

可以使用絕對座標的方式來指定組件的位置和大小,這時,我們要調用Container.setLayout(null), 然後再調用 Container.setBounds()方法。

import java.awt.Button;
import java.awt.Frame;

public class Test27 {
    // 例子,自定義按鈕的位置
    public static void main(String[] args) {
        Frame f = new Frame();
        f.setSize(500, 400);

        f.setLayout(null); // 取消佈局管理器
        Button btn = new Button("這是按鈕");
        btn.setBounds(50, 50, 80, 40);
        f.add(btn);

        f.setVisible(true);
    }
}

二、對話框(Dialog)

對話框在我們日常用電腦時經常見到,不再贅述。直接上代碼例子,熟練一下應用。

import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

public class Test28 {
    public static void main(String[] args) {
        new MyWindow();
    }
}

class MyWindow {
    MyWindow() {
        init();
    }

    private Dialog dlg; // 對話框
    private Label lblMsg; // 標簽

    private Frame f;
    private Button btn;
    private TextField txtDir; // 用來輸入目錄名稱
    private TextArea txtFileList; // 用來顯示文件列表

    private void init() {
        f = new Frame("目錄查看器");
        f.setBounds(30, 30, 400, 400);
        f.setLayout(new FlowLayout());

        txtDir = new TextField(30); // 30個字元長度
        btn = new Button("顯示文件");
        txtFileList = new TextArea(20, 35); // 用來顯示文件列表的區域

        f.add(txtDir);
        f.add(btn);
        f.add(txtFileList);

        dlg = new Dialog(f, "提示信息"); // 這個true代表它是否是模態的
//如果是dlg=new Dialog(f, "提示信息",true),代表彈出來對話框以後,就不可以再對後面的對話框進行操作了
lblMsg = new Label("輸入的目錄不正確"); dlg.add(lblMsg); dlg.setBounds(200, 200, 250, 100); dlg.setLayout(new FlowLayout()); initEvent(); f.setVisible(true); } private void initEvent() { dlg.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { ((Dialog) e.getSource()).setVisible(false); // dlg.setVisible(false); }; }); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { txtFileList.setText(""); String dirStr = txtDir.getText(); // 取出用戶輸入的路徑 File file = new File(dirStr); if (file.isDirectory() && file.exists()) { String[] fileNameList = file.list(); for (String s : fileNameList) { txtFileList.append(s + "\r\n"); // 不要忘了加換行符 } } else { // txtFileList.append("你輸入的都是啥?"); dlg.setVisible(true); } } }); } }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在這篇文章中,我將介紹在ASP.NET Core MVC中 IControllerActivator 是如何創建控制器的,以及通過依賴註入創建控制器存在的差異。 ...
  • 這是很簡單。。 HTML <div> <input type="file" id="myfile"> <input type="button" value="上傳" onclick="HeadPortraitPicture()"> </div> JS代碼 function HeadPortraitP ...
  • 沒時間介紹了,廢話不說先上車 以下所有扯淡都是建立在.NETCore2.0環境已經搭建好 右鍵解決方案>新建項目> 選擇Web>ASP.NETCoreWeb應用程式(.NET Core) 選擇Web應用程式,暫時不選擇啟用Docker,身份驗證選擇個人用戶賬戶(會自動生成一系列和用戶認證的代碼) 隨 ...
  • JdbcTemolate類的介紹 JdbcTemplate是Spring JDBC的核心類,封裝了常見的JDBC的用法,同時儘量避免常見的錯誤。該類簡化JDBC的操作,我們只需要書寫提供SQL的代碼和如何返回的結果的代碼。JdbcTemplate可以執行查詢、更新等操作、初始化對ResultSets ...
  • argparse 是一個用於解析 命令行選項,參數以及 子命令的庫 源碼來自 Lib/argparse.py 主要功能: 1、使得用戶編寫命令行變得簡單 2、針對程式需要的參數,argparse知道如何從sys.argv中解析這些參數 3、針對用戶給程式無效的參數,argparse可以自動生成幫助u ...
  • 最近項目中用到二維碼圖片識別,在python下二維碼識別,目前主要有三個模塊:zbar 、zbarlight、zxing。 1、三個模塊的用法: 2、使用對比 1、zbar和zbarlight內核一致,都是基於zbar的dll編譯載入的。 2、zbarlight使用比zbar更簡單,不過是在zbar ...
  • Eclipse 的控制台必須用GBK編碼。所以條件1和條件4必須同時滿足否則運行的還是亂碼。才能保證不是亂碼。 條件1,Window | Preferences | Workspace | Text fileencoding | GBK編碼。這樣定義的是整個工作區間的編碼。這樣就把整個工作空間的編碼 ...
  • 1.定義 模塊:本質就是.py結尾的文件(邏輯上組織python代碼)模塊的本質就是實現一個功能 文件名就是模塊名稱 包: 一個有__init__.py的文件夾;用來存放模塊文件2.導入模塊 import 模塊名 form 模塊名 import * from 模塊名 import 模塊名 as 新名... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...