Java: Cách Tạo Hộp Thoại (Dialog) - V1Study

Học viện Đào tạo và Công nghệ V1Study
  • Đào tạo Độ tuổi từ 5 - 11 Độ tuổi từ 12 - 17 Từ 18 tuổi
  • Lập trình Python Lập trình C C++ Java C# - C Sharp Android Scratch Pascal Robot mBot
  • Web ReactJS HTML5 CSS3 JavaScript Node.js JSP ASP.NET Core jQuery PHP
  • FW-CMS Laravel AngularJS Flutter Magento Bootstrap VueJS CodeIgnitor WordPress Sass Drupal
  • Video Video Python Video Lập trình C Video C# Video Java Video HTML5-CSS3-JavaScript Video SQL Server Video PHP Video jQuery Video Android Video C++ Video Scratch
  • Video1 Video XML-JSON Video MySQL Video Excel Video Giải thuật và Lập trình Video Sức khỏe Video Drupal Video mBot Video Giáo dục - Khoa học
  • Other Unity Giải thuật và lập trình Giải thuật và lập trình - C CCNA Mạng máy tính Design Patterns English Facebook SEO Git Tin học đại cương Japanese App-Uti Download
  • Data SQL Server XML JSON MySQL
  • News
Học viện Đào tạo và Công nghệ V1Study ≡ Java Java Core Giới thiệu Download, cài đặt và chạy Kiểu dữ liệu Từ khóa, tên riêng, ghi chú Biến & Hằng Phép toán (Operator) Nhập liệu với Scanner và System.in.read() Bài tập Java cơ bản Điều kiện if-else Điều kiện switch-case Bài tập phần điều kiện Vòng lặp for và for cải tiến while do-while break và continue Bài tập phần vòng lặp Mảng một chiều trong Java Mảng hai chiều trong Java Bài tập phần mảng số Bài tập phần chuỗi và mảng chuỗi Hàm (Function) Bài tập phần hàm ArrayList trong Java Quản lý bộ nhớ trong Java Tìm hiểu về đối tượng StringBuilder trong Java Cách xuống dòng mới khi dùng NetBean hay IntelliJ enum trong Java Hướng đối tượng (OOP) Lớp (Class) và Đối tượng (Object) Truy cập các thuộc tính và phương thức của đối tượng Hàm tạo (Constructor) Bộ khởi tạo cho đối tượng Từ khóa this Bài tập phần Class Từ khóa static Thừa kế (Inheritant) Ghi đè phương thức (Override) Từ khóa super Đa hình (Polymorphism) Bài tập phần Thừa kế & Đa hình Đóng gói (Encapsulation) Trừu tượng (Abstract) Interface (Giao diện) Bài tập phần Abstract Class & Interface Kiểu liệt kê Lớp lồng nhau (Nested Classes) Exceptions Ngoại lệ là gì? Bắt hoặc chỉ định yêu cầu Khối try Khối catch Khối finally Câu lệnh try-with-resources Cách sử dụng try-catch-finally Xác định những ngoại lệ được ném bởi một phương thức Dùng throw để ném ngoại lệ Ngoại lệ kết chuỗi (Chained Exception) Tạo lớp ngoại lệ Ngoại lệ unchecked - Tranh luận Ưu điểm của ngoại lệ throw và throws Ngoại lệ tự định nghĩa KIỂM TRA KIẾN THỨC EXCEPTION Câu hỏi và bài tập phần Exception Functions Hàm xử lý chuỗi (String) Hàm toán học (Math) Hàm Date & Time Video Demo Nhập liệu bằng Scanner trong Java In các số từ 0 đến 100 dùng vòng lặp for Xác định tính nguyên tố Cách khai báo biến trong Java Xác định chính phương Xác định số nguyên hay thực Tìm số nguyên tố trong một khoảng In ra các số chẵn chia hết cho 3 Giải phương trình bậc nhất Giải phương trình bậc hai Nguyên âm, phụ âm hay ký số Cách tạo lớp và đối tượng Cách tạo các getter và setter Cách định nghĩa hàm tạo Cách sử dụng các getter và setter Cách tạo mảng Cách nhập liệu cho mảng Cách tìm Max và Min trong mảng Cách sắp xếp mảng Xóa phần tử có chỉ số cụ thể khỏi mảng Xóa phần tử chứa giá trị cụ thể khỏi mảng Cách dùng ArrayList và viết chương trình dạng Menu Nhập vào 10 số nguyên rồi loại bỏ những giá trị trùng lặp Xóa những phần tử trùng nhau Tuts Cách thay đổi kích thước text trong IntelliJ Một số phím tắt trong IntelliJ IDEA Cách tạo ảnh nền cho jFrame Form Cách sử dụng các class từ project khác API Collection Sắp xếp trong collection Gói java.util Framework Collections Interface Collection List ArrayList Vector LinkedList Set SortedSet HashSet LinkedHashSet Lớp TreeSet Map HashMap Hashtable TreeMap LinkedHashMap Queue PriorityQueue Arrays Sắp xếp Collections Các cải tiến trong các lớp Collections KIỂM TRA KIẾN THỨC COLLECTIONS CÂU HỎI VÀ BÀI TẬP COLLECTIONS Phương thức Collections.synchronizedList() và ví dụ So sánh ArrayList và Vector Generics Tổng quan về Generics Lớp generic Phương thức generic Kiểu suy luận (Type Inference) Collection và Generic Khả năng tương tác với Generics KIỂM TRA KIẾN THỨC GENERICS CÂU HỎI VÀ BÀI TẬP GENERICS Regular Expression Giới thiệu biểu thức chính quy Kiểm tra dữ liệu (Test Harness) Hằng chuỗi Lớp Character Các lớp ký tự định nghĩa trước Bộ định lượng (Quantifier) Nhóm thu thập So khớp ranh giới Các phương thức của lớp Pattern Các phương thức của lớp Matcher Các phương thức của lớp PatternSyntaxException Hỗ trợ Unicode Lớp Pattern Lớp Matcher Bài tập phần Biểu thức chính quy Gói java.lang Giới thiệu Lớp Object Bộ dọn rác (Garbage Collector) Các lớp Wrapper Hàm toán học (Math) Lớp System Lớp Class Hàm xử lý chuỗi (String) KIỂM TRA KIẾN THỨC JAVA.LANG Taught Thừa kế (Inheritant) Chữa bài tập 1 phần thừa kế Trừu tượng (Abstract) và Đa hình (Polymorphism) Interface Lớp generic try-catch-finally Thao tác với MySQL Java IO Giới thiệu I/O Stream Byte Stream Character Stream Buffered Stream Scanning và Formatting I/O từ Command Line Data Stream Object Stream Đường dẫn là gì? (và sự kiện hệ thống tập tin khác) Lớp Path Các hoạt động với File Kiểm tra tập tin hoặc thư mục Xóa tập tin hoặc thư mục Sao chép tập tin hoặc thư mục Di chuyển tập tin hoặc thư mục Quản lý siêu dữ liệu (File và File lưu các thuộc tính) Đọc, ghi và tạo tập tin Tập tin truy cập ngẫu nhiên Tạo và đọc thư mục Liên kết, liên kết tượng trưng hay không phải Đi bộ qua cây tập tin Tìm tập tin Quan sát sự thay đổi thư mục Các phương thức hữu dụng khác Kế thừa mã lệnh tập tin I/O Cách tạo và chèn dữ liệu vào file Excel Java DOM Parser - Đọc, tạo, sửa tài liệu XML KIỂM TRA KIẾN THỨC JAVA IO Câu hỏi và bài tập phần java.io file Java NIO Lớp Console Gói java.util.zip Lớp Deflater Lớp Inflater Lớp DeflaterInputStream Lớp DeflaterOutputStream Các lớp InflaterInputStream và InflaterOutputStream Gói java.nio Lớp Files và các thuộc tính KIỂM TRA KIẾN THỨC JAVA NIO Concurrency - Thread Tiến trình (Progress) và Luồng (Thread) Định nghĩa và khởi tạo Thread Dừng thực thi với phương thức Thread.sleep() Ngắt và kết nối Thread Ví dụ SimpleThreads Giao thoa luồng Lỗi nhất quán bộ nhớ Phương thức đồng bộ hóa Khóa nội tại và đồng bộ hóa Truy cập atomic Liveness Khối bảo vệ Đối tượng bất biến Đối tượng Lock Giao diện (interface) Executor Thread Pool Framwork Fork/Join Gói concurrent Biến atomic Số ngẫu nhiên đồng thời Câu hỏi và bài tập phần Concurrency - Thread Thread Swing Về JFC và Swing Biên dịch và chạy chương trình Swing Học Swing với NetBeans IDE Thiết lập dự án CelsiusConverter Cơ bản về IDE NetBeans Tạo giao diện CelsiusConverter Điều chỉnh giao diện CelsiusConverter Thêm logic cho ứng dụng Cách dùng bộ chứa mức top Lớp JComponent JScrollPane JSlider Giới thiệu về Timer JProgressBar Cách sử dụng Text Component JFormattedTextField Cách sử dụng ButtonGroup Cách sử dụng Color Chooser Cách tạo hộp thoại (Dialog) JEditorPane Cách sử dụng nhãn (Label) Cách sử dụng Panel Cách sử dụng Password Field Cách sử dụng Slider (JSlider) Cách sử dụng Tabbed Pane Cách sử dụng bảng (Table) Text Area Cách sử dụng Text Field (JTextField) Cách sử dụng Tool Bar Cách sử dụng Tool Tip Cách sử dụng Tree Cách sử dụng HTML trong Swing Component JTextPane Cách sử dụng đường bao (Border) Cách sử dụng Icon Demo-Calculator-V1 Kiểm tra kiến thức Swing-JDBC Cách sử dụng JList Bài hướng dẫn số 1 JDBC Database Access Giới thiệu JDBC Kiến trúc JDBC Tổng quan về cơ sở dữ liệu quan hệ Thiết lập kết nối Cách kết nối tới các RDBMS trong Java JDBC Ví dụ Commit và Rollback Kết nối Cơ sở dữ liệu Java với MySQL Demo Java Select, Insert, Update, Delete với MySQL BÀI TẬP PHẦN JDBC Code ví dụ về serverTimezone Lập trình truyền thông Tổng quan về lập trình truyền thông References InputStream isWhitespace Format String Syntax Class Paths toUri toAbsolutePath toRealPath equals startsWith endsWith Phương thức iterator() Interface Comparator<T> Interface Comparable<T> Class Files Interface Closeable Class FileSystemException Class FileSystem Enum LinkOption Class FileTime Interface BasicFileAttributes Interface PosixFileAttributes Class PosixFilePermissions Class UserPrincipalLookupService Class FileStore Interface BasicFileAttributeView Interface DosFileAttributeView Interface PosixFileAttributeView Interface FileOwnerAttributeView Interface AclFileAttributeView Interface UserDefinedFileAttributeView Interface DosFileAttributes Cách dùng NetBeans IDE Class Scanner Đóng và mở Form trong Java Swing Lấy kích thước của Form hiện thời Sửa chiều rộng của phần tử con bằng chiều rộng phần tử cha i18n Examples Ví dụ lớp Copy Ví dụ lớp Chmod Ví dụ lớp Xdd Ví dụ lớp DiskUsage Ví dụ HelloWorldSwing Ví dụ lớp TopLevelDemo BoxAlignmentDemo BorderDemo BoxLayoutDemo IconDemoApp FormattedTextFieldDemo ButtonDemo ButtonHtmlDemo TextAreaDemo TextDemo TextSamplerDemo HtmlDemo BasicDnD FocusConceptsDemo TabbedPaneDemo TableRenderDemo TableToolTipsDemo ActionDemo PasswordDemo TextFieldDemo DialogDemo TextInputDemo TreeDemo TreeIconDemo TreeIconDemo2 ComboBoxDemo ComboBoxDemo2 DynamicTreeDemo GenealogyExample TreeExpandEventDemo TreeExpandEventDemo2 CheckBoxDemo ListDialog LabelDemo SplitPaneDemo SliderDemo2 TableDialogEditDemo TextComponentDemo ColorChooserDemo ToolBarDemo ToolBarDemo2 ScrollDemo ScrollDemo2 TableDemo ButtonTabComponent TabComponentDemo TabbedPaneDemo Converter ListDemo TableSelectionDemo SimpleTableDemo SimpleTableSelectionDemo TableFTFEditDemo TableSortDemo TableFilterDemo TablePrintDemo ListSelectionDemo SharedModelDemo IntegerEditor TableSorter ColorRenderer TableSorterDemo ColorEditor CustomDialog Framework ListOfNumbers ListOfNumbers2 SliderDemo ColorChooserDemo2 RadioButtonDemo SpinnerDemo SpinnerDemo2 SpinnerDemo3 SpinnerDemo4 ListDataEventDemo CustomComboBoxDemo Đồng hồ số với thread Hiển thị ảnh trên JPanel Practicals Bài tập phần Swing - Practical 1 - Form Bài tập phần Swing - Practical 2 - Event Bài tập phần Swing - Practical 3 - JSlider - JProgressBar Bài tập phần Swing - Practical 4 - Data JDBC Bài tập phần Swing - Practical 5 - Game xếp số Test Java1 Solutions Solution phần Java IO Solution tham khảo Bài tập phần Class Solution Practical 1 Solution phần Exception Hệ thống quản lý số điện thoại Hệ thống quản lý tin tức (news) Solution câu hỏi và bài tập phần Generics Solution câu hỏi và bài tập Collections Solution Concurrency-Thread Solutions I18N Solution bài tập phần vòng lặp JavaFX Tổng quan JavaFX Cài đặt JavaFX Kiến trúc của JavaFX Cấu trúc ứng dụng JavaFX và ví dụ Tạo hình dạng 2 chiều (2D) Vẽ đoạn thẳng 2D Vẽ hình chữ nhật 2D Vẽ hình chữ nhật tròn 2D Vẽ đường tròn/hình tròn 2D Vẽ hình elip 2D Vẽ hình đa giác (Polygon) 2D Vẽ đa giác mở (Polyline) 2D Vẽ đường cong hình khối (CubicCurve) 2D Vẽ đường cong bậc 2 (QuadCurve) 2D Vẽ cung (Arc) 2D Vẽ hình SVG 2D Phần tử đường dẫn LineTo 2D Phần tử đường dẫn HLineTo 2D Phần tử đường dẫn VLineTo 2D Phần tử đường dẫn QuadCurveTo 2D Phần tử đường dẫn CubicCurveTo 2D Phần tử đường dẫn ArcTo 2D Thao tác Union Thao tác Intersection Thao tác Subtraction Tạo văn bản (Text) Hiệu ứng chỉnh màu (ColorAdjust) Hiệu ứng nhập màu (ColorInput) Hiệu ứng nhập ảnh (ImageInput) Hiệu ứng trộn (Blend) Hiệu ứng nở (Bloom) Hiệu ứng phát sáng (Glow) Hiệu ứng làm mờ hộp (BoxBlur) JUnit Tổng quan về JUnit Thiết lập môi trường Framework kiểm thử JUnit Cách sử dụng cơ bản API Viết chương trình kiểm thử Sử dụng Assertion Thủ tục thực thi Thực thi các test Test suite Bỏ qua test Thời gian test Ngoại lệ (Exception) test Tham số hóa test Chạy JUnit bằng Ant Thiết lập JUnit với Eclipse Phần mở rộng JUnit với Netbeans IDE Thiết lập JUnit test trong IntelliJ Java: Cách tạo hộp thoại (Dialog) Khóa học qua video: Lập trình Python All Lập trình C# All SQL Server All Lập trình C Java PHP HTML5-CSS3-JavaScript Đăng ký Hội viên Tất cả các video dành cho hội viên

Một cửa sổ hộp thoại (Dialog) là một cửa sổ con độc lập với ý nghĩa mang theo thông báo tạm thời ngoài cửa sổ chính của Swing Application. Phần lớn hộp thoại được dùng để hiển thị thông báo lỗi hoặc cảnh báo tới người dùng, nhưng hộp thoại cũng có thể hiển thị ảnh, cây thư mục, hoặc bất kỳ điều gì tương thích với ứng dụng Swing đang quản lý.

Để thuận tiện thì một số lớp thành phần của Swing có thể trực tiếp khởi tạo và hiển thị hộp thoại. Để tạo các hộp thoại chuẩn một cách đơn giản thì ta sử dụng lớp JOptionPane. Lớp ProgressMonitor có thể lấy một hộp thoại để hiển thị tiến trình của một hoạt động. Hai lớp khác là JColorChooser và JFileChooser cũng cho phép hiển thị các hộp thoại chuẩn. Để tạo hộp thoại in ấn thì ta có thể sử dụng API Printing. Để tạo một hộp thoại tùy chỉnh thì ta sử dụng lớp trực tiếp là JDialog.

Câu lệnh đơn giản dưới đây sẽ tạo ra một hộp thoại trông như thế này:

An informational dialog requires minimal code

JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.");

Sau đây là các chủ đề mà bài viết này đề cập tới:

  • Tổng quan về hộp thoại
  • Ví dụ DialogDemo
  • Các đặc điểm của JOptionPane
  • Tạo và hiển thị hộp thoại đơn giản
  • Tùy chỉnh chữ của nút lệnh
  • Lấy thông tin người dùng điền từ hộp thoại
  • Không đong hộp thoại tự động
  • API Dialog
  • Ví dụ có sử dụng Dialog

Tổng quan về hộp thoại

Mỗi hộp thoại đều phụ thuộc vào một thành phần Frame. Khi Frame bị hủy thì các hộp thoại phụ thuộc của nó cũng bị hủy. Khi frame được biểu tượng hóa thì các hộp thoại phụ thuộc của nó cũng không xuất hiện trên màn hình. Khi frame không được biểu tượng hóa thì các hộp thoại phụ thuộc của nó mới hiển thị được ra màn hình. Một lớp JDialog cũng thừa kế đặc điểm này từ lớp AWT Dialog.

Một hộp thoại có thể là modal. Khi hộp thoại modal xuất hiện thì nó sẽ khóa không cho người dùng nhập liệu ở tất cả các cửa sổ trong chương trình đó. JOptionPane tạo JDialog ở dạng modal. Để tạo một hộp thoại ở dạng non-modal thì bạn phải sử dụng lớp trực tiếp là JDialog.

Từ bản JDK 7 thì ta có thể thay đổi hành vi cửa sổ hộp thoại bằng cách sử dụng API Modality mới.

Lớp JDialog là lớp con của lớp AWT java.awt.Dialog. Nó thêm bộ chứa root pane và hỗ trợ hoạt động đóng mặc định tới đối tượng Dialog. Đây là những đặc điểm mà JFrame cũng có, và việc sử dụng JDialog trực tiếp rất tương tự với việc sử dụng JFrame. Nếu bạn muốn sử dụng JDialog trực tiếp thì bạn cần nắm được các thành phần trong bài viết Cách dùng bộ chứa mức top và Cách tạo Frame, đặc biệt là bài viết Phản hồi cho sự kiện đóng cửa sổ.

Ngay cả khi bạn sử dụng JOptionPane để thực thi một hộp thoại thì bạn vẫn cần phải sử dụng JDialog phía sau. Lý do là vì JOptionPane đơn giản là một bộ chứa có thể tự động tạo một JDialog và thêm nó vào chính phần nội dung của JDialog.

Ví dụ DialogDemo

Hình dưới đây thể hiện một ứng dụng có tên DialogDemo:

DialogDemo lets you bring up many kinds of dialogs

Các đặc điểm của JOptionPane

Nếu sử dụng JOptionPane thì ta có thể nhanh chóng tạo và tùy chỉnh được một số loại hộp thoại khác nhau. JOptionPane cung cấp các hỗ trợ cho việc bố cục các hộp thoại chuẩn, cung cấp các icon, chỉ định tiêu đề hộp thoại và văn bản, và tùy chỉnh chữ trong nút lệnh. Những đặc điểm khác cũng cho phép bạn tùy chỉnh các thành phần hiển thị hộp thoại và chỉ định nơi hiển thị hộp thoại trên màn hình chương trình. Ta cũng có thể chỉ định một option pane để đặt chính nó vào một internal frame (JInternalFrame) thay vì JDialog.

Khi ta tạo một JOptionPane, thì mã lệnh look-and-feel-specific sẽ thêm các thành phần tới JOptionPane và xác định bố cục của những thành phần này.

Icon của JOptionPane sẽ hỗ trợ ta dễ dàng chỉ định icon nào của hộp thoại được hiển thị. Ta có thể sử dụng một icon tùy chỉnh, hoặc không sử dụng icon nào, hoặc một icon bất kỳ trong bốn icon chuẩn của JOptionPane (câu hỏi, thông tin, cảnh báo, và lỗi). Mỗi look and feel sẽ có các phiên bản riêng đối với bốn icon chuẩn này. Các hình dưới đây thể hiện các icon được sử dụng trong Java (và Windows) look and feel.

Các Icon được sử dụng bởi JOptionPane
Mô tả Java look and feel Windows look and feel
câu hỏi The Java look and feel icon for dialogs that ask questions The Windows look and feel icon for dialogs that ask questions
thông tin The Java look and feel icon for informational dialogs The Windows look and feel icon for informational dialogs
cảnh báo The Java look and feel icon for warning dialogs The Windows look and feel icon for warning dialogs
lỗi The Java look and feel icon for error dialogs The Windows look and feel icon for error dialogs

Tạo và hiển thị hộp thoại đơn giản

Đa phần các hộp thoại hiển thị đều ở dạng đơn giản, ta tạo và hiển thị hộp thoại bằng cách sử dụng các phương thức dạng showYxxDialog của JOptionPane. Nếu hộp thoại của bạn phải là một frame nội bộ thì ta thêm Internal vào sau show, ví dụ như showMessageDialog sẽ đổi thành showInternalMessageDialog. Nếu bạn cần điều khiển hộp thoại với hành vi đóng cửa sổ hoặc nếu bạn không muốn hộp thoại ở dạng modal, thif ta nên trực tiếp thể hiện hóa JOptionPane và thêm nó vào một thể hiện của JDialog, sau đó gọi phương thức setVisible(true) trên JDialog để nó xuất hiện.

Hai phương thức hữu dụng nhất dạng showYyyDialog là showMessageDialog và showOptionDialog. showMessageDialog sẽ hiển thị một hộp thoại đơn giản trong đó có một nút lệnh, còn showOptionDialog sẽ hiển thị một hộp thoại tùy chỉnh — nó có thể hiển thị các nút lệnh khác nhau và có thể chứa một thông báo chuẩn hoặc có thể là một tập hợp các thành phần.

Hai hộp thoại khác dạng showYyyDialog ít được sử dụng hơn là showConfirmDialog sẽ yêu cầu người dùng xác nhận điều gì đó, nhưng hiển thị ở dạng nút lệnh chuẩn (dạng Yes/No) mà không phải nút văn bản tùy chỉnh theo tình huống sử dụng (dạng Start/Cancel; và phưng thức thứ tư là showInputDialog, nó được thiết kế để hiển thị hộp thoại modal để lấy chuỗi dữ liệu từ người dùng trong đó có một text field, một combo box không chỉnh sửa hoặc một danh sách (list).

Dưới đây là một số ví dụ trích từ ví dụ DialogDemo, trong đó có sử dụng các phương thức showMessageDialog, showOptionDialog, và hàm tạo JOptionPane. Bạn có thể xem nhiều ví dụ hơn tại phần Ví dụ có sử dụng Dialog.

showMessageDialog

Hiển thị hộp thoại modal có một nút lệnh có nhãn là "OK". Ta có quyền chỉ định thông báo, icon và tiều đề cho hộp thoại hiển thị. Dưới đây là một số ví dụ của loại hộp thoại showMessageDialog:

Informational dialog with default title and icon

//tiêu đề và icon mặc định JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.");

Informational dialog with custom title, warning icon

//Tùy chỉnh tiêu đề và icon cảnh báo JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.", "Inane warning", JOptionPane.WARNING_MESSAGE);

Informational dialog with custom title, error icon

//tùy chỉnh tiêu đề và icon báo lỗi JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.", "Inane error", JOptionPane.ERROR_MESSAGE);

Informational dialog with custom title, no icon

//tùy chỉnh tiêu đề và không có icon JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.", "A plain message", JOptionPane.PLAIN_MESSAGE);

Informational dialog with custom title, custom icon

//tùy chỉnh tiêu đề và icon JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.", "Inane custom dialog", JOptionPane.INFORMATION_MESSAGE, icon);

showOptionDialog

Hiển thị hộp thoại modal với trong đó cho phép chỉ định nút lệnh, icon, thông báo, tiêu đề, ... Phương thức này còn cho phép ta thay đổi văn bản xuất hiện trên các nút lệnh của hộp thoại chuẩn. Ta cũng có thể thực hiện được nhiều tùy chỉnh khác nữa.

Yes/No/Cancel (in different words); showOptionDialog

//tùy chỉnh văn bản cho nút lệnh Object[] options = {"Yes, please", "No, thanks", "No eggs, no ham!"}; int n = JOptionPane.showOptionDialog(frame, "Would you like some green eggs to go " + "with that ham?", "A Silly Question", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[2]);

JOptionPane (hàm tạo)

Tạo một JOptionPane trong đó cho phép chỉ định nút lệnh, icon, thông báo, tiêu đề, ... Lưu ý là ta cần phải thêm option pane vào JDialog, đăng ký một bộ lắng nghe sự thay đổi thuộc tính trên option pane, và hiển thị hộp thoại. Xin xem chi tiết tại phần Không đóng hộp thoại tự động.

Explicitly used the JOptionPane constructor
final JOptionPane optionPane = new JOptionPane( "The only way to close this dialog is by\n" + "pressing one of the following buttons.\n" + "Do you understand?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);

Các đối số của tất cả các hộp thoại dạng showYyyDialog và các hàm tạo của JOptionPane đều đã được tiêu chuẩn hóa mặc dù số lượng đối số của mỗi phương thức và hàm tạo là khác nhau. Dưới đây ta sẽ tìm hiểu từng đối số một. Để xem mỗi phương thức có những đối số nào ta có thêm xem tại phần API Dialog.

Component parentComponent

The JOptionPane constructors do not include this argument. Instead, you specify the parent frame when you create the JDialog that contains the JOptionPane, and you use the JDialog setLocationRelativeTo method to set the dialog position.

Đối số đầu tiên cho mỗi phương thức showYyyDialog luôn luôn là thành phần cha, trong đó bao gồm một Frame, một thành phần bên trong Frame, hoặc null. Nếu bạn chỉ định Frame hoặc một Dialog, thì Dialog sẽ xuất hiện trên trung tâm của Frame và sau đó là hành vi focus của Frame đó. Nếu bạn chỉ định một thành phần bên trong một Frame thì Dialog sẽ xuất hiện phía trên trung tâm của thành phần đó và sẽ theo sau hành vi focus của Frame của thành phần đó. Nếu bạn chỉ định null, thì look and feel sẽ chọn một vị trí thích hợp cho hộp thoại - nói chung là trung tâm của màn hình - và Dialog sẽ không nhất thiết phải theo sau hành vi focus của bất kỳ Frame hay Dialog nào.

Các hàm tạo JOptionPane không bao gồm đối số này. Thay vào đó, bạn chỉ định frame cha khi bạn tạo JDialog chứa JOptionPane, và bạn sử dụng phương thức của JDialog là setLocationRelativeTo để thiết lập vị trí hộp thoại.

Object message

Tham số bắt buộc này chỉ ra hộp thoại sẽ hiển thị trong khu vực chính của nó. Nói chung, bạn chỉ định một chuỗi, mà kết quả trong hộp thoại hiển thị một nhãn với văn bản được chỉ định. Bạn có thể chia nhỏ các thông điệp trên nhiều dòng bằng cách đặt ký tự newline (\n) bên trong chuỗi thông báo. Ví dụ:

"Complete the sentence:\n \"Green eggs and...\""

String title

Tiêu đề của hộp thoại.

int optionType

Chỉ định tập các nút lệnh xuất hiện phía cuốc hộp thoại. Chúng được chọn từ một trong các tập sau: DEFAULT_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION, OK_CANCEL_OPTION.

int messageType

Tham số này xác định icon được hiển thị trong hộp thoại. Icon được chọn từ một trong các giá trị sau: PLAIN_MESSAGE (no icon), ERROR_MESSAGE,INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE.

Icon icon

Icon hiển thị trong hôp thoại.

Object[] options

Thường được sử dụng để xác định chuỗi hiển thị bởi mỗi nút ở dưới cùng của hộp thoại. Xem phần Tùy chỉnh văn bản nút lệnh để biết thêm thông tin. Nó cũng có thể được sử dụng để xác định các biểu tượng sẽ được hiển thị bằng các nút hoặc các thành phần không phải nút được thêm vào hàng nút.

Object initialValue

Xác định giá trị mặc định được chọn.

Bạn có thể có thể để cửa sổ tùy chọn hiển thị biểu tượng mặc định của nó hoặc chỉ định các biểu tượng này bằng kiểu thông báo hoặc tham số icon. Theo mặc định, một cửa sổ tùy chọn được tạo với showMessageDialog sẽ hiển thị icon thông tin, một được tạo ra với showConfirmDialog hoặc showInputDialog sẽ hiển thị các icon dấu hỏi, và một được tạo ra với hàm tạo JOptionPane sẽ không hiển thị icon. Để xác định rằng hộp thoại hiển thị một biểu tượng chuẩn hoặc không có biểu tượng, thì ta xác định kiểu của thông báo tương ứng với các biểu tượng mà bạn mong muốn. Để xác định một biểu tượng tùy chỉnh thì ta sử dụng đối số biểu tượng. Đối số biểu tượng được ưu tiên hơn so với loại thông báo; miễn là các tham số biểu tượng có một giá trị null, hộp thoại sẽ hiển thị biểu tượng quy định.

Tùy chỉnh văn bản nút lệnh

Khi bạn sử dụng JOptionPane để tạo ra một hộp thoại, bạn có thể sử dụng văn bản nút lệnh tiêu chuẩn (mà có thể thay đổi tùy theo look and feel và miền địa phương) hoặc chỉ định văn bản khác. Theo mặc định, loại cửa sổ tùy chọn sẽ xác định có bao nhiêu nút xuất hiện. Ví dụ, hộp thoại YES_NO_OPTION có hai nút, và YES_NO_CANCEL_OPTION có ba nút.

Mã lệnh sau đây được trích từ ví dụ DialogDemo, dùng để tạo hai hộp thoại Yes/No. Hộp thoại đầu tiên được thực hiện với showConfirmDialog, trong đó sử dụng từ ngữ của look and feel cho hai nút lệnh. Hộp thoại thứ hai sử dụng showOptionDialog để nó có thể tùy chỉnh từ ngữ. Ngoại trừ những thay đổi từ ngữ, các hộp thoại là giống hệt nhau.

A yes/no dialog, in those words [but perhaps translated]

//icon mặc định, tiêu đề tùy chỉnh int n = JOptionPane.showConfirmDialog( frame, "Would you like green eggs and ham?", "An Inane Question", JOptionPane.YES_NO_OPTION);

A yes/no dialog -- in other words

Object[] options = {"Yes, please", "No way!"}; int n = JOptionPane.showOptionDialog(frame, "Would you like green eggs and ham?", "A Silly Question", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, //không sử dụng icon tùy chỉnh options, //các tiêu để của các nút options[0]); //tiêu đề nút mặc định

Như đoạn mã trên đây cho thấy, các phương thức showMessageDialog, showConfirmDialog, và showOptionDialog trả về một số nguyên cho biết sự lựa chọn của người dùng. Các giá trị của số nguyên này là YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION, và CLOSED_OPTION. Ngoại trừ CLOSED_OPTION, mỗi tùy chọn tương ứng với một nút mà người dùng nhấn. Khi CLOSED_OPTION được trả về, nó chỉ ra rằng người dùng đã đóng cửa sổ hộp thoại một cách tường minh, chứ không phải bằng cách chọn một nút bên trong cửa sổ tùy chọn.

Ngay cả khi bạn thay đổi các chuỗi hiển thị các nút hộp thoại tiêu chuẩn, thì giá trị trả về vẫn là một trong những nguyên được xác định trước. Ví dụ, một hộp thoại YES_NO_OPTION luôn luôn trả về một trong các giá trị sau: YES_OPTION, NO_OPTION, hoặc CLOSED_OPTION.

Lấy dữ liệu của người dùng từ hộp thoại

Hộp thoại showYyyDialog trả về một đối tượng. Đối tượng này nói chung là một chuỗi phản ánh sự lựa chọn của người dùng. Dưới đây là một ví dụ sử dụng hộp thoại showInputDialog để cho phép người dùng chọn một trong ba chuỗi:

An input dialog with a combo box

Object[] possibilities = {"ham", "spam", "yam"}; String s = (String)JOptionPane.showInputDialog(frame, "Complete the sentence:\n" + "\"Green eggs and...\"", "Customized Dialog", JOptionPane.PLAIN_MESSAGE, icon, possibilities, "ham");

//Nếu một chuỗi được trả về thì thiết lập nhãn có chứa chuỗi. if ((s != null) && (s.length() > 0)) { setLabel("Green eggs and... " + s + "!"); return; }

//Nếu không thì setLabel("Come on, finish the sentence!");

Nếu ta không quan tâm tới giới hạn lựa chọn của người dùng thì ta có thể sử dụng form của phương thức showInputDialog gồm một vài đối số hoặc chỉ định null cho mảng đối tượng. Trong Java look and feel thì việc thay thế null bằng possibilities sẽ cho kết quả là một hộp thoại giống như hình dưới đây:

An input dialog with a text field

Do người dùng có thể điền bất kỳ điều gì vào text field nên ta có thể muốn kiểm tra giá trị trả về và yêu cầu người dùng điền giá trị hợp lệ. Lúc này ta dùng giải pháp là tạo hộp thoại tùy chỉnh để validate dữ liệu nhập vào trước khi nó trả về. Bạn có thể xem chi tiết về điều này tại ví dụ CustomDialog.

Nếu bạn cần thiết kế API cho hộp thoại của bạn thì bạn có thể truy vấn hộp thoại về những gì mà người dùng đã chọn. Ví dụ như trong ví dụ CustomDialog có phương thức getValidatedText, phương thức này trả về văn bản do người dùng điền vào.

Không đóng hộp thoại tự động

Mặc định thì khi người dùng nhấn vào nút được tạo JOptionPane thì hộp thoại sẽ đóng. Nhưng điều gì sẽ xảy ra nếu ta muốn kiểm tra câu trả lời của người dùng trước khi đóng hộp thoại? Trong trường hợp này thì ta phải thực thi bộ lắng nghe sự thay đổi của thuộc tính để khi người dùng nhấn vào nút lệnh của hộp thoại thì hộp thoại sẽ không tự động đóng.

Ví dụ DialogDemo chứa hai hộp thoại thực thi bộ lắng nghe sự thay đổi của thuộc tính, một trong những hộp thoại này là hộp thoại modal tùy chỉnh, việc thực thi nằm bên trong ví dụ CustomDialog, nó sử dụng cả JOptionPane để lấy icon chuẩn và nhận sự hỗ trợ bố cục. Còn hộp thoại kia (đoạn mã dướ đây) dùng một chuẩn JOptionPane Yes/No. Mặc dù hộp thoại này khá vô dụng nhưng mã lệnh của nó đủ đơn giản và ta có thể sử dụng nó như một template cho nhiều hộp thoại phức tạp.

Bên cạnh việc thiết lập bộ lắng nghe sự thay đổi của thuộc tính thì đoạn mã dưới đây cũng gọ phương thức JDialog's setDefaultCloseOperation và thực thi một bộ lắng nghe cửa sổ để xử lý việc đóng cửa sổ cho phù hợp. Nếu ta không quan tâm tới thông báo khi người dùng đóng cửa sổ thì ta có thể bỏ qua những câu lệnh in đậm.

final JOptionPane optionPane = new JOptionPane( "The only way to close this dialog is by\n" + "pressing one of the following buttons.\n" + "Do you understand?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);

final JDialog dialog = new JDialog(frame, "Click a button", true); dialog.setContentPane(optionPane); dialog.setDefaultCloseOperation( JDialog.DO_NOTHING_ON_CLOSE); dialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { setLabel("Thwarted user attempt to close window."); } }); optionPane.addPropertyChangeListener( new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName();

if (dialog.isVisible() && (e.getSource() == optionPane) && (prop.equals(JOptionPane.VALUE_PROPERTY))) { /* Nếu bạn kiểm tra điều gì đó trước khi đóng cửa sổ, thì bạn thực hiện ở đây. */ dialog.setVisible(false); } } }); dialog.pack(); dialog.setVisible(true);

int value = ((Integer)optionPane.getValue()).intValue(); if (value == JOptionPane.YES_OPTION) { setLabel("Good."); } else if (value == JOptionPane.NO_OPTION) { setLabel("Try using the window decorations to close the non-auto-closing dialog. You can't!"); }

API Dialog

Các bảng dưới đây liệt kê các phương thức và hàm tạo phổ biến của JOptionPane và JDialog. Các phương thức khác ta có thể gọi được định nghĩa trong các lớp Dialog, Window và Component như pack, setSize, và setVisible.

Hiển thị các hộp thoại chuẩn (sử dụng các phương thức của lớp JOptionPane)
Phương thức Mục đích
static void showMessageDialog(Component, Object) static void showMessageDialog(Component, Object, String, int) static void showMessageDialog(Component, Object, String, int, Icon)

Hiển thị một nút, hộp thoại modal cung cấp cho người sử dụng một số thông tin. Các đối số chỉ định (theo thứ tự) là các thành phần cha, thông báo, tiêu đề, loại thông báo, và biểu tượng cho hộp thoại. Xem lại phần Tạo và hiển thị hộp thoại đơn giản.

static int showOptionDialog(Component, Object, String, int, int, Icon, Object[], Object)

Hiển thị một hộp thoại modal tùy chỉnh. Các đối số chỉ định (theo thứ tự) là các thành phần cha, thông báo, tiêu đề, loại lựa chọn, loại thông báo, biểu tượng, các lựa chọn, và giá trị ban đầu cho hộp thoại.

static int showConfirmDialog(Component, Object) static int showConfirmDialog(Component, Object, String, int) static int showConfirmDialog(Component, Object, String, int, int) static int showConfirmDialog(Component, Object, String, int, int, Icon)

Hiển thị một hộp thoại modal yêu cầu người chọn một câu hỏi. Các đối số chỉ định (theo thứ tự) là các thành phần cha, thông báo, tiêu đề, loại lựa chọn, loại thông báo, và biểu tượng cho hộp thoại.

static String showInputDialog(Object) static String showInputDialog(Component, Object) static String showInputDialog(Component, Object, String, int) static String showInputDialog(Component, Object, String, int, Icon, Object[], Object)

Hiển thị một hộp thoại modal nhắc nhở người dùng nhập dữ liệu. Phiên bản đối số duy nhất quy định cụ thể chỉ là thông báo, với thành phần cha giả định là null. Các đối số cho các phiên bản khác chỉ định (theo thứ tự) là các thành phần cha mẹ, thông báo, tiêu đề, loại thông báo, biểu tượng, lựa chọn, và giá trị ban đầu cho hộp thoại.

static void showInternalMessageDialog(...) static void showInternalOptionDialog(...) static void showInternalConfirmDialog(...) static String showInternalInputDialog(...)

Thực hiện một hộp thoại tiêu chuẩn như một khung nội bộ. Xem bài viết JOptionPane để biết danh sách chính xác các đối số.

Những phương thức sử dụng trực tiếp JOptionPanes
Phương thức/Hàm tạo Mục đích
JOptionPane() JOptionPane(Object) JOptionPane(Object, int) JOptionPane(Object, int, int) JOptionPane(Object, int, int, Icon) JOptionPane(Object, int, int, Icon, Object[]) JOptionPane(Object, int, int, Icon, Object[], Object) Tạo một thể hiện của JOptionPane.
static Frame getFrameForComponent(Component) static JDesktopPane getDesktopPaneForComponent(Component) Vận dụng các phương thức của lớp JOptionPane để tìm frame hoặc desktop pane tương ứng mà thành phần đã chỉ định.
int getMaxCharactersPerLineCount() Xác định nơi ngắt dòng sẽ được tự động được chèn vào văn bản cửa số tùy chọn (mặc định là Integer.MAX_VALUE). Để sử dụng phương thức này thì bạn phải tạo một phân lớp JOptionPane. Ví dụ, kết quả của đoạn mã sau là một cửa sổ tùy chọn với một từ mỗi dòng, mỗi từ chứa tối đa 5 ký tự: JOptionPane op = new JOptionPane("This is the text.") { public int getMaxCharactersPerLineCount() { return 5; } };
Phương thức và hàm tạo phổ biến của JDialog
Phương thức/Hàm tạo Mục đích
JDialog() JDialog(Dialog) JDialog(Dialog, boolean) JDialog(Dialog, String) JDialog(Dialog, String, boolean) JDialog(Dialog, String, boolean, GraphicsConfiguration) JDialog(Frame) JDialog(Frame, boolean) JDialog(Frame, String) JDialog(Frame, String, boolean) JDialog(Frame, String, boolean, GraphicsConfiguration) JDialog(Window owner) JDialog(Window owner, Dialog.ModalityType modalityType) JDialog(Window owner, String title) JDialog(Window owner, String title, Dialog.ModalityType modalityType) JDialog(Window owner, String title, Dialog.ModalityType modalityType, GraphicsConfiguration gc)

Tạo một thể hiện của JDialo. Đối số Frame nếu có, là khung (thường là một đối tượng JFrame) mà hộp thoại phụ thuộc vào. Tạo tham số boolean true xác định một hộp thoại modal, false hoặc không chỉ định một hộp thoại không modal. Bạn cũng có thể xác định tiêu đề của hộp thoại, sử dụng một tham số kiểu chuỗi.

void setContentPane(Container) Container getContentPane() Lấy hoặc thiết lập cửa sổ nội dung, thường là bộ chứa cho tất cả các thành phần của hộp thoại. Xem thêm thông tin tại bài viết Cách dùng bộ chứa mức top.
void setDefaultCloseOperation(int) int getDefaultCloseOperation() Lấy hoặc thiết lập những gì sẽ xảy ra khi người dùng đóng hộp thoại. Các giá trị có thể: DISPOSE_ON_CLOSE,DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE (mặc định).
void setLocationRelativeTo(Component) Thiết lập trung tâm của hộp thoại nằm trên thành được chỉ định.
static void setDefaultLookAndFeelDecorated(boolean) static boolean isDefaultLookAndFeelDecorated() Thiết lập hoặc lấy gợi ý về phần trang trí cửa sổ hộp thoại (như là đường viền, hoặc các widget để đóng cửa số) nên được cung cấp bởi look and feel hiện thời, nếu không thì phần trang trí của hộp thoại sẽ được cung cấp trình quản lý cửa số hiện thời.

Ví dụ sử dụng Dialog

  • DialogDemo
  • CustomDialog
  • Framework
  • ListDialog
» Tiếp: JEditorPane « Trước: Cách sử dụng Color Chooser Khóa học qua video: Lập trình Python All Lập trình C# All SQL Server All Lập trình C Java PHP HTML5-CSS3-JavaScript Đăng ký Hội viên Tất cả các video dành cho hội viên Khóa học qua video: Lập trình Python All Lập trình C# All SQL Server All Lập trình C Java PHP HTML5-CSS3-JavaScript Đăng ký Hội viên Tất cả các video dành cho hội viên Copied !!! Copy linkCopied link!
Bạn muốn tìm kiếm điều gì?

Từ khóa » Dialog Trong Java Là Gì