2012-09-21 44 views
6

Nếu tôi tạo JFrames không thể thay đổi kích thước và cửa sổ Aero được bật setLocation dường như không tính đến đường viền cửa sổ chính xác.không thể thay đổi kích thước cửa sổ và vị trí

Trong đoạn mã sau, tôi mong đợi khung thứ hai được đặt ở bên phải của khung hình đầu tiên, thay vào đó các đường viền được chồng lên nhau. Nếu Aero bị tắt hoặc nếu tôi xóa các cuộc gọi đến setResizable, việc này được thực hiện như mong đợi.

import java.awt.Rectangle; 
import javax.swing.JFrame; 
public class FrameBorders { 
public static void main(String[] args) { 
    JFrame frame1 = new JFrame("frame 1"); 
    JFrame frame2 = new JFrame("frame 2"); 

    frame1.setResizable(false); 
    frame2.setResizable(false); 

    frame1.setVisible(true);   
    Rectangle bounds = frame1.getBounds();  
    frame2.setLocation(bounds.x+bounds.width, bounds.y); 
    frame2.setVisible(true); 

} 
} 

Tôi có làm gì sai hoặc đây là lỗi không? Làm cách nào để hiển thị 2 hộp thoại không thể thay đổi cạnh nhau mà không có đường viền chồng chéo?

Edit: thêm ảnh chụp màn hình (cũng thay đổi frame2 đến một JDialog thay vì một JFrame)

Aero On: Aero On

Aero Tắt: Aero Off

Aero On nhưng thay đổi kích thước: Aero On but resizable

+0

Tại sao bạn muốn hiển thị 2 unresizable hộp thoại cạnh nhau mà không cần phải biên giới chồng chéo? –

+0

Tôi muốn hiển thị 2 cửa sổ ban đầu được đặt cạnh nhau – msam

+2

Vui lòng không đặt các giới hạn tùy ý trên vùng chứa không thể thay đổi kích thước. Xem [* Việc sử dụng nhiều JFrames, Thực hành tốt/xấu *] (http://stackoverflow.com/a/9554657/230513)? – trashgod

Trả lời

7

Các vấn đề với se là gì ttings giới hạn trên container không thể thay đổi kích cỡ?

Giả sử bạn điều chỉnh các giới hạn để trông đẹp trên nền tảng của bạn. Giả sử nền tảng của người dùng có phông chữ khác nhau, nói lớn hơn, FontMetrics. Ví dụ này có phần gây tranh cãi, nhưng bạn có ý tưởng. Nếu bạn thay đổi giới hạn của vùng chứa không thể thay đổi kích thước, hãy đảm bảo mọi văn bản đều hiển thị bất kể phông chữ mặc định của nền tảng máy chủ.

image

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

/** 
* @see http://stackoverflow.com/a/12532237/230513 
*/ 
public class Evil extends JPanel { 

    private static final String s = 
     "Tomorrow's winning lottery numbers: 42, "; 
    private JLabel label = new JLabel(s + "3, 1, 4, 1, 5, 9", JLabel.LEFT); 

    public Evil() { 
     this.add(label); 
    } 

    private void display() { 
     JFrame f = new JFrame("Evil"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this, BorderLayout.WEST); 
     f.pack(); 
     int w = SwingUtilities.computeStringWidth(
      label.getFontMetrics(label.getFont()), s); 
     int h = f.getHeight(); 
     f.setSize(w, h); 
     f.setResizable(false); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new Evil().display(); 
      } 
     }); 
    } 
} 
+1

Bạn có thể đã giàu! – trashgod

+0

Đây là một điểm tốt về việc thay đổi kích thước có liên quan (và sẽ là câu trả lời hay cho câu hỏi tôi đưa ra trong các ý kiến ​​nếu tự mình thực hiện), tuy nhiên vấn đề ban đầu của tôi là định vị. Giả sử sử dụng gói()/không có văn bản/kích thước sẽ không thay đổi hoặc thậm chí các hộp thoại/khung trống như trong ví dụ giả tạo của riêng tôi. – msam

+1

Hãy thử 'pack()', cái mà "Gây ra 'Cửa sổ' này có kích thước để vừa với kích cỡ và bố cục ưa thích của các thành phần con của nó." Xin lỗi, tôi không sử dụng aero; một [sscce] (http://sscce.org/) thể hiện vấn đề bạn mô tả có thể hữu ích. – trashgod

5

Dường như đây không phải là một vấn đề Java mà là một aero appcompat vấn đề, như mô tả here.

Một giải pháp mà tôi thấy trong Java là để cho các cửa sổ được thay đổi kích thước sau đó làm việc xung quanh setMaximumSize bug

+0

+1 tìm kiếm tốt ... –

+0

Liên kết tốt; nền tảng sở hữu khung trang trí, vì vậy kết quả không phải là _completely_ thái quá; 'aqua' có phần bất thường tương tự. – trashgod

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