2009-04-25 37 views
39

Tôi có một nút trên JFrame khi nhấp vào Tôi muốn hộp thoại bật lên với nhiều vùng văn bản để nhập người dùng. Tôi đã tìm kiếm tất cả các xung quanh để cố gắng tìm ra cách để làm điều này nhưng tôi cứ ngày càng bối rối hơn. Có ai giúp được không?Java - Cách tạo hộp thoại tùy chỉnh?

Trả lời

73

Nếu bạn không cần nhiều hành vi tùy chỉnh, JOptionPane là trình tiết kiệm thời gian tốt. Nó sẽ chăm sóc vị trí và nội địa hóa của các tùy chọn OK/Hủy, và là một cách nhanh chóng và bẩn để hiển thị một hộp thoại tùy chỉnh mà không cần phải xác định các lớp học của riêng bạn. Phần lớn thông số "message" trong JOptionPane là một String, nhưng bạn có thể truyền vào một JComponent hoặc một mảng các JComponents.

Ví dụ:

JTextField firstName = new JTextField(); 
JTextField lastName = new JTextField(); 
JPasswordField password = new JPasswordField(); 
final JComponent[] inputs = new JComponent[] { 
     new JLabel("First"), 
     firstName, 
     new JLabel("Last"), 
     lastName, 
     new JLabel("Password"), 
     password 
}; 
int result = JOptionPane.showConfirmDialog(null, inputs, "My custom dialog", JOptionPane.PLAIN_MESSAGE); 
if (result == JOptionPane.OK_OPTION) { 
    System.out.println("You entered " + 
      firstName.getText() + ", " + 
      lastName.getText() + ", " + 
      password.getText()); 
} else { 
    System.out.println("User canceled/closed the dialog, result = " + result); 
} 
+0

Ví dụ này tiếc là không hỗ trợ ví dụ tabbing giữa các trường hoặc nhấn Enter cho "ok". – aioobe

+0

Bạn có thể kiểm soát nhiều hơn hộp thoại bằng cách tạo một JOptionPane bằng cách sử dụng một hàm tạo, sau đó gọi createDialog trên kết quả JOptionPane. Điều này cung cấp cho bạn một JDialog, mà bạn có thể tùy chỉnh thêm trước khi làm cho nó hiển thị. Tại một số điểm mặc dù, nó có ý nghĩa hơn để cuộn thành phần tùy chỉnh của riêng bạn. –

+1

@aioobe Trong JRE của tôi cả hai tabbing dụ và nhấn Enter cho nút OK làm việc (mặc dù rất nhiều thời gian đã trôi qua kể từ khi bình luận của bạn). Tuy nhiên, có một nhược điểm khác là giải pháp này: không có cách nào để phân biệt giữa nút OK được nhấn và cửa sổ hộp thoại đóng lại. Vì vậy, không có cách nào để hủy bỏ hành động của bạn. – Vic

2

This lesson từ hướng dẫn Java giải thích chi tiết từng thành phần Swing, với các ví dụ và liên kết API.

1

Nếu bạn sử dụng NetBeans IDE (phiên bản mới nhất tại thời điểm này là 6.5.1), bạn có thể sử dụng nó để tạo ứng dụng GUI GUI cơ bản bằng cách sử dụng Tệp-> Dự án mới và chọn danh mục Java sau đó ứng dụng Java Desktop.

Sau khi tạo, bạn sẽ có ứng dụng GUI xương trần đơn giản có chứa một hộp khoảng có thể mở bằng cách sử dụng lựa chọn menu. Bạn sẽ có thể thích nghi điều này với nhu cầu của bạn và tìm hiểu cách mở một hộp thoại từ một nút bấm.

Bạn sẽ có thể chỉnh sửa hộp thoại trực quan. Xóa các mục có ở đó và thêm một số vùng văn bản. Chơi xung quanh với nó và trở lại với nhiều câu hỏi hơn nếu bạn gặp khó khăn :)

1

Vâng, về cơ bản bạn tạo một JDialog, thêm các thành phần văn bản của bạn và làm cho nó hiển thị. Nó có thể giúp đỡ nếu bạn thu hẹp mà cụ thể bit bạn đang gặp rắc rối với.

1

Hãy thử lớp đơn giản này để tùy biến một hộp thoại theo ý thích của bạn:

import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JComponent; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JRootPane; 

public class CustomDialog 
{ 
    private List<JComponent> components; 

    private String title; 
    private int messageType; 
    private JRootPane rootPane; 
    private String[] options; 
    private int optionIndex; 

    public CustomDialog() 
    { 
     components = new ArrayList<>(); 

     setTitle("Custom dialog"); 
     setMessageType(JOptionPane.PLAIN_MESSAGE); 
     setRootPane(null); 
     setOptions(new String[] { "OK", "Cancel" }); 
     setOptionSelection(0); 
    } 

    public void setTitle(String title) 
    { 
     this.title = title; 
    } 

    public void setMessageType(int messageType) 
    { 
     this.messageType = messageType; 
    } 

    public void addComponent(JComponent component) 
    { 
     components.add(component); 
    } 

    public void addMessageText(String messageText) 
    { 
     JLabel label = new JLabel("<html>" + messageText + "</html>"); 

     components.add(label); 
    } 

    public void setRootPane(JRootPane rootPane) 
    { 
     this.rootPane = rootPane; 
    } 

    public void setOptions(String[] options) 
    { 
     this.options = options; 
    } 

    public void setOptionSelection(int optionIndex) 
    { 
     this.optionIndex = optionIndex; 
    } 

    public int show() 
    { 
     int optionType = JOptionPane.OK_CANCEL_OPTION; 
     Object optionSelection = null; 

     if(options.length != 0) 
     { 
      optionSelection = options[optionIndex]; 
     } 

     int selection = JOptionPane.showOptionDialog(rootPane, 
       components.toArray(), title, optionType, messageType, null, 
       options, optionSelection); 

     return selection; 
    } 

    public static String getLineBreak() 
    { 
     return "<br>"; 
    } 
} 
Các vấn đề liên quan