2009-05-12 40 views
30

Tôi muốn có một hộp thoại bên trong (không cửa sổ) để yêu cầu nhập thành viên. Tôi muốn hộp thoại được đặt ở vị trí trung tâm trên JPanel hiện tại.Java Swing - cách hiển thị bảng điều khiển ở đầu bảng khác?

Tôi đã xem layeredpanes và những điều này dường như không thể sử dụng do chỉ có một người quản lý bố cục (hoặc không có trình quản lý bố cục) trên tất cả các ngăn. Tôi đoán tôi có thể cố gắng để ghi đè lên JLayeredPane và cung cấp một bố trí tùy chỉnh nhưng điều này có vẻ cực đoan.

Glass panes dường như không phù hợp.

Làm cách nào để thực hiện điều này? Không có khái niệm có thể sử dụng của chỉ mục z trong Swing?

http://i42.tinypic.com/30tkuvk.jpg

EDIT

Lý do Layered Panes là không phù hợp là do thiếu một người quản lý bố trí cho mỗi lớp. Bảng điều khiển có thể thay đổi kích thước, Bảng A phải ở 100% diện tích và Bảng B phải được tập trung.

+0

Xem - như một tùy chọn - cách (rất đơn giản) mở rộng JLayeredPane để chấp nhận bất kỳ loại LayouManager nào. http://stackoverflow.com/questions/42413590/jlayeredpane-and-gridbagconstraints – Mischa

Trả lời

34

Tôi nghĩ LayeredPane là cược tốt nhất của bạn ở đây. Bạn sẽ cần một bảng điều khiển thứ ba mặc dù có chứa A và B. Bảng thứ ba này sẽ là lớp lớp và sau đó bảng A và B vẫn có thể có một LayoutManagers đẹp. Tất cả bạn sẽ phải làm là trung tâm B trên A và có khá nhiều ví dụ trong đường mòn Swing về cách thực hiện điều này. Tutorial for positioning without a LayoutManager.

public class Main { 
    private JFrame frame = new JFrame(); 
    private JLayeredPane lpane = new JLayeredPane(); 
    private JPanel panelBlue = new JPanel(); 
    private JPanel panelGreen = new JPanel(); 
    public Main() 
    { 
     frame.setPreferredSize(new Dimension(600, 400)); 
     frame.setLayout(new BorderLayout()); 
     frame.add(lpane, BorderLayout.CENTER); 
     lpane.setBounds(0, 0, 600, 400); 
     panelBlue.setBackground(Color.BLUE); 
     panelBlue.setBounds(0, 0, 600, 400); 
     panelBlue.setOpaque(true); 
     panelGreen.setBackground(Color.GREEN); 
     panelGreen.setBounds(200, 100, 100, 100); 
     panelGreen.setOpaque(true); 
     lpane.add(panelBlue, new Integer(0), 0); 
     lpane.add(panelGreen, new Integer(1), 0); 
     frame.pack(); 
     frame.setVisible(true); 
    } 


    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     new Main(); 
    } 

} 

Bạn sử dụng setBounds để định vị các bảng trong ngăn lớp và cũng để đặt kích thước của chúng.

Chỉnh sửa để phản ánh những thay đổi bài gốc Bạn sẽ cần phải thêm người nghe thành phần đó phát hiện khi container cha mẹ đã được thay đổi kích cỡ và sau đó tự động thay đổi các giới hạn của bảng A và B.

+0

Xin chào, đây là đại lộ mà tôi đã theo đuổi ban đầu nhưng tôi không thể tìm ra cách làm cho A và B hoạt động mà không sử dụng setBounds. Các tài liệu cho JLayeredPane đề cập đến "Tất cả các trình quản lý bố cục được cung cấp bởi nền tảng Java sắp xếp các thành phần như thể chúng là tất cả trên một lớp." – Pool

+0

Đúng vậy. Để định vị A và B bạn cần sử dụng setBounds. Các bảng A và B vẫn có thể có bất cứ LayoutManager nào bạn muốn định vị các thành phần bên trong chúng. Câu trả lời đó có đáp ứng được câu hỏi của bạn không? – willcodejavaforfood

+1

Lý do tôi cố gắng sử dụng trình quản lý bố cục trên setBounds là bảng điều khiển có thể được thay đổi kích thước. Có thể mở rộng JLayeredPane, lắng nghe các thay đổi thành phần và gọi setBounds trên con của nó là một cách chính xác để giải quyết vấn đề này. (Tôi sẽ chỉnh sửa câu hỏi gốc để làm rõ điều này.) – Pool

1

Sử dụng 1 x 1 GridLayout trên JPanel hiện tại, sau đó thêm Bảng điều khiển của bạn vào JPanel đó. Vấn đề duy nhất với GridLayout đó là 1 của 1 là bạn sẽ không thể đặt các mục khác trên JPanel. Trong trường hợp này, bạn sẽ phải tìm ra cách bố trí phù hợp. Mỗi bảng điều khiển mà bạn sử dụng có thể sử dụng bố cục của riêng mình để không phải là vấn đề.

Tôi có hiểu chính xác câu hỏi này không?

+0

Cảm ơn, tôi đã thêm sơ đồ ở trên để làm rõ. Về cơ bản nó đặt các thành phần trên đầu trang của mỗi khác (z chỉ số) mà tôi không chắc chắn về. – Pool

+0

Oh ok tôi hiểu rồi, sai lầm của tôi. Cảm ơn bạn đã làm rõ thêm. – AlbertoPL

0

JOptionPane.showInternalInputDialog có thể làm những gì bạn muốn. Nếu không, nó sẽ rất hữu ích để hiểu những gì nó là mất tích.

+0

Cảm ơn, vì tôi hiểu điều này, nó sẽ hiển thị Khung nội bộ có giao diện cửa sổ. Tôi thực sự cần tùy chỉnh đầy đủ mà một bảng điều khiển sẽ cung cấp. – Pool

4

Bạn có thể thêm một undecorated JDialog như thế này:

import java.awt.event.*; 

import javax.swing.*; 

public class TestSwing { 
    public static void main(String[] args) throws Exception { 
    JFrame frame = new JFrame("Parent"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(800, 600); 
    frame.setVisible(true); 

    final JDialog dialog = new JDialog(frame, "Child", true);  
    dialog.setSize(300, 200); 
    dialog.setLocationRelativeTo(frame); 
    JButton button = new JButton("Button"); 
    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     dialog.dispose(); 
     } 
    }); 
    dialog.add(button); 
    dialog.setUndecorated(true); 
    dialog.setVisible(true); 
    } 
} 
+0

Cảm ơn, thật không may điều này tạo ra một cửa sổ mới, 1 cho undecorated mặc dù, hiệu ứng rất đẹp. – Pool

+0

Và tại sao đây là một vấn đề? Bây giờ tôi nhìn vào bạn câu hỏi lần thứ hai, bạn có thể muốn làm cho hộp thoại không phương thức và định vị lại nó khi khung cha được thay đổi kích cỡ. – mavroprovato

+0

Đó là một yêu cầu. Một hộp thoại/cửa sổ sẽ không có ý nghĩa đối với bảng điều khiển này. – Pool

5

tôi chỉ nghĩ rằng tôi muốn thêm rằng có một khái niệm về Z-trật tự trong Swing, xem [java.awt.Component # setComponentZOrder] [1]

ảnh hưởng đến vị trí của một thành phần trong mảng thành phần cha mẹ, xác định thứ tự bản vẽ.

Lưu ý rằng bạn nên ghi đè javax.swing.JComponent#isOptimizedDrawingEnabled để trả về false trong vùng chứa chính để có được các thành phần chồng chéo của bạn để vẽ lại chính xác, nếu không thì các dấu gạch chéo của chúng sẽ bị đè nén lẫn nhau.(JComponents giả không có con chồng chéo trừ isOptimizedDrawingEnabled trả về false)

[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Container.html#setComponentZOrder(java.awt.Component, int)

0

Có một quản lý bố trí mà bạn có thể quan tâm ở đây: Overlay Layout Dưới đây là một hướng dẫn đơn giản: OverlayLayout: for layout management of components that lie on top of one another. Bố cục lớp phủ cho phép bạn định vị các bảng trên đầu trang của nhau và đặt bố cục bên trong mỗi bảng. Bạn cũng có thể đặt kích thước và vị trí của mỗi bảng riêng biệt.

(Lý do tôi trả lời câu hỏi này từ nhiều năm trước là vì tôi đã vấp phải vấn đề tương tự, và tôi đã thấy rất ít đề cập về Bố cục lớp phủ trên StackOverflow, trong khi nó có vẻ được ghi lại khá tốt. điều này có thể giúp người khác tiếp tục tìm kiếm nó.)

Các vấn đề liên quan