2012-06-27 69 views
15

Tôi gặp vấn đề lạ. Tôi đang sử dụng cách bố trí null cho một cửa sổ (= JFrame và trên cửa sổ) và nếu tôi sử dụng setResizable (false) kích thước cửa sổ được lớn hơn (phải và dưới, khoảng 10 pixel tôi sẽ nói). Tôi không biết tại sao.Java setResizable (false) thay đổi kích thước cửa sổ (swing)

của hai println trả lại kích thước tương tự, những gì là lạ, cũng ...

mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
mainWnd.setTitle(wndTitle); 
mainWnd.setBounds(wndPosX, wndPosY, wndWidth, wndHeight); 
System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); 
mainWnd.setResizable(false); 
System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); 

Liệu ai đó có một ý tưởng? Tại sao cửa sổ được thay đổi kích thước?

UPDATE: Cùng một điều ở đây (biên dịch nó có và không có setResizable và hơn bạn có thể nhìn thấy nó, nếu bạn chồng lên cửa sổ):

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Main 
{ 
    private static JFrame mainWnd = null; 

    public static void main(String[] args) 
    { 
     mainWnd = new JFrame(); 

     mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainWnd.setTitle("asda"); 
     mainWnd.setBounds(50, 50, 300, 300); 

     mainWnd.setResizable(false); 

     mainWnd.setVisible(true); 
    } 
} 
+0

Bạn sẽ nhận được câu trả lời tốt hơn và nhanh hơn nếu bạn thể hiện một [SSCCE] (http://sscce.org). – assylias

+0

có một ví dụ, không thể dán phần còn lại, khiến xml-parser hoạt động sau nó và nhiều hơn nữa ... và sự cố chỉ xảy ra với cuộc gọi setResizable – immerhart

+0

Tôi không thể tạo lại hành vi. Vì vậy, hãy cố gắng loại bỏ tất cả các phần không cần thiết và đăng một ví dụ có thể biên dịch và chạy được có hành vi mà bạn đề cập. – assylias

Trả lời

13

Nó không thay đổi trên ví dụ của tôi, vì vậy bạn phải có cái gì khác mà gây ra vấn đề của bạn:

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Test4 { 

    protected static void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.setBounds(0, 0, 300, 200); 
     frame.setVisible(true); 
     System.err.println(frame.getSize()); 
     frame.setResizable(false); 
     System.err.println(frame.getSize()); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 

EDIT/UPDATE:

Bằng cách nào đó insets là không chính xác khi bạn thiết lập các thay đổi kích thước false (ít nhất trên Windows 7 và JDK 6). Bằng cách nào đó họ thay đổi từ 30,8,8,8 đến 25,3,3,3 mặc dù biên giới (được vẽ bởi hệ điều hành) vẫn thực sự giống nhau. Vì insets là một phần của các giới hạn của Frame, frame thực sự quá lớn (trực quan) khi nó không thể thay đổi kích thước. Đối với tôi có vẻ như có một lỗi trong insets tính toán khi khung không thể thay đổi kích thước.

+0

Tương tự ở đây ...... – assylias

+1

tôi nghĩ bạn nên bắt đầu cả hai cửa sổ, sau đó bạn thấy rằng không thể thay đổi kích thước lớn hơn! – immerhart

+1

Một số cách khắc phục không chính xác khi bạn đặt có thể thay đổi kích thước thành sai (ít nhất là trên Windows 7 và JDK 6). Bằng cách nào đó họ thay đổi từ 30,8,8,8 đến 25,3,3,3 mặc dù biên giới vẫn thực sự giống nhau. Vì insets là một phần của các giới hạn của Frame, frame thực sự quá lớn (trực quan) khi nó không thể thay đổi kích thước. Đối với tôi có vẻ như có một lỗi trong insets tính toán khi khung không thể thay đổi kích thước. –

1

Tùy thuộc vào L & Thiết lập F có thể thay đổi kích thước (sai/đúng) có thể thay đổi trang trí viền cửa sổ. Không tối đa hóa, không thay đổi kích thước mũi tên. Bản thân điều đó có thể thay đổi kích thước.

+0

Trong trường hợp, không có bộ L & F khác, ví dụ, với giao diện mặc định, nó cũng thay đổi kích thước cửa sổ. – FaithReaper

1

Thay thế:

frame.setResizable(false); 

tới:

SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      frame.setResizable(false); 
     } 
    }); 
+0

Sự cố vẫn tiếp diễn. Nó không phải là một giải pháp. – FaithReaper

4

Nếu bạn đặt setResizable sai trước khi thiết lập các giới hạn, bạn sẽ không có vấn đề. như Gergely Szilagyi đã nói trước đây, bạn đang loại bỏ các thanh cuộn, nhưng kích thước của cửa sổ bị khóa và do đó bạn kết thúc với 9 hoặc 10 pixel của không gian thừa trong khung. tôi chỉ có cùng một vấn đề. cảm ơn đã giúp đỡ.

+0

Không, nó giữ cho tôi sự khác biệt giữa hai JFrames. – FaithReaper

0

Cho đến nay, bản vá tốt nhất cho vấn đề gây phiền nhiễu này là như sau. Không quan trọng bạn gọi phương thức setResizable(false) ở đâu. Chỉ cần thêm đoạn mã sau khi bạn setVisible(true).

private void sizeBugPatch() { 
    while (frame.getWidth() > yourWidth) { 
     frame.pack(); 
    } 
} 

đâu yourWidthrộng bạn đã thiết lập trong bất kỳ cách nào có thể, hoặc bằng tay hoặc bằng cách ghi đè setPreferredSize phương pháp. Giải thích là khá dễ dàng, frame.pack() dường như đặt lại frame.setResizable(boolean b) bằng cách nào đó. Bạn có thể sử dụng một số if thay vì vòng lặp while nhưng tôi thích while để loại trừ trường hợp cửa sổ vẫn sẽ có kích thước cực lớn ngay cả sau một giây thứ hai pack().

0

Tôi có 2 lớp con JFrame được xác định. Nếu tôi chạy khung sự cố trong một ứng dụng độc lập, kích thước khung hình chính xác. Nếu tôi chạy cả hai khung trong một ứng dụng độc lập, khung sự cố vẫn lớn hơn. Tôi đã setResizable (sai) trước khi gói, và tôi vẫn nhận được vấn đề.Cách giải quyết của tôi là thay đổi bố cục thành BorderLayout và vuốt bảng (hình ảnh) ở giữa, sau đó thực hiện setResizable.

1

Vâng, tôi đã gặp vấn đề này và nó là một Look & Feel vấn đề ...

Tại sao khung thay đổi kích thước có insets của (5, 5, 5, 5)? Nó dẫn tôi nghĩ rằng làm cho nó có thể thay đổi kích thước thêm một số thành phần phụ xung quanh khung, như ... một số loại "xử lý" để kéo để thay đổi kích thước?

Và sau đó tôi thấy rằng nếu chúng tôi sử dụng kim loại Java mặc định l & f và đặt setDefaultLookAndFeelDecorated(true), trình xử lý sẽ được vẽ và do đó, khung sẽ không thay đổi kích thước. Nhưng ở Nimbus, Motif và Windows L & F điểm này không được triển khai, do đó, nó là một lỗi. Tôi sẽ báo cáo.

câu hỏi của riêng tôi và câu trả lời của tôi với GIF là ở đây:

Swing - setResizable(true) make JFrame title bar higher and window size smaller

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