2012-05-10 18 views
6

Tôi đang cố gắng tạo một JDialog tùy chỉnh bằng cách sử dụng windowBuilder, nhưng ngay từ đầu tôi đã gặp phải một số vấn đề. Vì vậy, đây là:Java không thể gọi JDialog đơn giản được xây dựng bằng cách sử dụng eclipse WindowBuilder

Tôi đã tạo Jdialog đơn giản bằng cách sử dụng windowBuilder. Ở đây nó là mã:

public class GroupFrame extends JDialog { 

    private final JPanel contentPanel = new JPanel(); 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     try { 
      GroupFrame dialog = new GroupFrame(); 
      dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
      dialog.setVisible(true); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Create the dialog. 
    */ 
    public GroupFrame() { 
     setBounds(100, 100, 450, 300); 
     getContentPane().setLayout(new BorderLayout()); 
     contentPanel.setLayout(new FlowLayout()); 
     contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     getContentPane().add(contentPanel, BorderLayout.CENTER); 
     { 
      JPanel buttonPane = new JPanel(); 
      buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); 
      getContentPane().add(buttonPane, BorderLayout.SOUTH); 
      { 
       JButton okButton = new JButton("OK"); 
       okButton.setActionCommand("OK"); 
       buttonPane.add(okButton); 
       getRootPane().setDefaultButton(okButton); 
      } 
      { 
       JButton cancelButton = new JButton("Cancel"); 
       cancelButton.setActionCommand("Cancel"); 
       buttonPane.add(cancelButton); 
      } 
     } 
    } 

} 

Nhưng sau đó tôi muốn thay đổi công main (String [] args) static void một cái gì đó giống như public void show().

Các chương trình mới() phương pháp mã là:

public void show() { 
     try { 
      GroupFrame dialog = new GroupFrame(); 
      dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
      dialog.setVisible(true); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Vì vậy, khi tôi đang triyng để gọi phương thức thay đổi này bằng cách sử dụng đoạn mã sau:

GroupFrame groupFrame = new GroupFrame(); 
groupFrame.show(); 

tôi đã có StackOverflowError (Thật là ngẫu nhiên!; D):

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
    at sun.awt.Win32GraphicsConfig.getBounds(Native Method) 
    at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source) 
    at java.awt.Window.init(Unknown Source) 
    at java.awt.Window.<init>(Unknown Source) 
    at java.awt.Window.<init>(Unknown Source) 
    at java.awt.Dialog.<init>(Unknown Source) 
    at java.awt.Dialog.<init>(Unknown Source) 
    at javax.swing.JDialog.<init>(Unknown Source) 
    at javax.swing.JDialog.<init>(Unknown Source) 
    at javax.swing.JDialog.<init>(Unknown Source) 
    at UILayer.GroupFrame.<init>(GroupFrame.java:32) 
    at UILayer.GroupFrame.show(GroupFrame.java:21) 
    at java.awt.Component.show(Unknown Source) 
    at java.awt.Component.setVisible(Unknown Source) 
    at java.awt.Window.setVisible(Unknown Source) 
    at java.awt.Dialog.setVisible(Unknown Source) 
    at UILayer.GroupFrame.show(GroupFrame.java:23) 
    at java.awt.Component.show(Unknown Source) 
    at java.awt.Component.setVisible(Unknown Source) 
    at java.awt.Window.setVisible(Unknown Source) 
    at java.awt.Dialog.setVisible(Unknown Source) 
    at UILayer.GroupFrame.show(GroupFrame.java:23) 
    (etc...) 

Có ai cho tôi biết những gì tôi đang làm không?

Cảm ơn trước!

+0

Và mã của phương thức show() là? –

+0

xin lỗi, đã sửa. –

Trả lời

4

Bạn xây dựng một GroupFrame, và gọi phương thức show(), xây dựng một GroupFrame khác. Điều này đã sai rồi. Nhưng nó thậm chí còn sai hơn bởi vì sau đó bạn gọi setVisible(true) mà nội bộ gọi phương thức show() mà bạn vô tình bị quá tải.

Phương pháp chương trình nên được đặt tên là cái gì khác, và nên tĩnh:

public static GroupFrame createAndShow() { 
    GroupFrame dialog = new GroupFrame(); 
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    dialog.setVisible(true); 
} 

Phương pháp này do đó sẽ được gọi là như thế này:

GroupFrame.createAndShow(); 

Và làm ơn, đừng bắt ngoại lệ. Và khi bạn làm điều đó, đừng nuốt ngoại lệ.

+0

Cảm ơn, bài đăng của bạn đã làm mọi thứ rõ ràng hơn. Và vấn đề với việc bắt ngoại lệ là gì? Đó là một thực hành tồi? –

+2

Vâng, đó là một thực tế không tốt. Chỉ bắt ngoại lệ mà bạn có thể xử lý. Nếu bạn không thể xử lý nó, hãy để nó đi lên ngăn xếp cho đến khi nó có thể được xử lý. –

3

Nhưng sau đó tôi muốn thay đổi chính void công cộng chính (String [] args) thành một cái gì đó như công cộng void show().

Bạn không thể làm điều đó, phương pháp chính có chữ ký chính xác là điểm bắt đầu của chương trình Java (đối với hầu hết các trường hợp nhưng không phải tất cả).

Những gì bạn cần là một show phương pháp riêng biệt mà sẽ làm cho hộp thoại của bạn có thể nhìn thấy

EDIT:

Nhận thấy lớp học của bạn kéo dài JDialog, có nghĩa là nếu bạn xác định chương trình một lần nữa, bạn đang về mặt kỹ thuật trọng phương pháp này hiện diện trong Dialog, hiển thị thêm không được chấp nhận.

Từ các tài liệu:

Deprecated. Kể từ JDK phiên bản 1.5, thay thế bằng setVisible (boolean).

Làm cho hộp thoại hiển thị. Nếu hộp thoại và/hoặc chủ sở hữu của nó chưa được hiển thị , cả hai đều được hiển thị. Hộp thoại sẽ được xác thực trước khi được hiển thị. Nếu hộp thoại đã được hiển thị là , hộp thoại này sẽ hiển thị hộp thoại phía trước. Nếu hộp thoại là phương thức và không hiển thị, cuộc gọi này sẽ không trả lại cho đến khi hộp thoại bị ẩn bằng cách gọi ẩn hoặc bỏ. Nó được phép hiển thị các hộp thoại phương thức từ sự kiện gửi chủ đề vì bộ công cụ sẽ đảm bảo rằng một máy bơm sự kiện khác chạy trong khi yêu cầu phương pháp này bị chặn.

Thay vì sử dụng này:

public static void showMyDialog(){ 
    try { 
     GroupFrame dialog = new GroupFrame(); 
     dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     dialog.setVisible(true); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

và trong phương pháp chính của bạn, bạn gọi showMyDialog.

Nhưng phương pháp chính phải có mặt trong lớp nếu bạn muốn nó chạy dưới dạng Ứng dụng Java, nếu một số lớp khác gọi phương thức hiển thị của bạn thì bạn không cần tồn tại phương thức chính trong lớp của mình.