2012-11-22 23 views
5

600x600 bir ContentPanel ile bir JFrame yapmak istedim ve JFrame'in yeniden boyutlandırılmasını istemedim. Bu kutunun içinde, programı çalıştırdığımda her şeyin eşleştiğinden emin olmak için 600x600 kırmızı çizili bir dikdörtgen çizdim. JFrame için yeniden boyutlandırma kısıtlayan önce, yaparak benim JFrame boyutunu ayarlayın:JFrame isResizable (false) boyutlandırma sorunu

getContentPane().setPreferredSize(new Dimension(600,600)); 
pack(); 

Ve başlattığı programı ve benim dikdörtgenin sınırları JFrame boyutlarında mükemmel uyum. Ancak, denklem içine isResizable (false) eklediğimde, dikdörtgenin sağ kenarı ile dikdörtgenin alt kenarı arasında bir piksel tamponu görünüyordu. Küçük bir deneme ve hata ile, Riteable (false), yüksekliğe ve genişliğe 10 piksel ekler gibi görünüyor. (Bu yüzden, contentPane + için 590x590 boyutuna sahip olmak ekstra 10 benim geçici çözümümdür)

Sorularım neden bu? Ekstra 10 pikselle ilgili herhangi bir belge bulamıyorum. Not: Bu anormallik ayrıca boyut değiştirmeden bir JFrame yapılarak da gözlemlenmiştir. Yeniden boyutlandırılmadan, gözlenebilir bir panel/contentPane yoktur, ancak isResizable (false) kullanıldığında, panelin/panelin görünür bir kısmı vardır.

+0

sonra çağrı JFrame#pack sıfırlayabilirsiniz? –

cevap

5

Haklısınız, bir çerçeveyi sabitlemek için 10 piksele yükseklik ve genişlik katıyor gibi görünmüyor, nedenini söyleyemem, bunun yerel akranı güncellemenin yan etkisi olduğu düşünülüyor. ...

sen paketini çağırmadan önce * * Eğer sigara boyutlandırılabilir hale emin misiniz çağıran JFrame#setResizable

public class TestResizableFrame { 

    public static void main(String[] args) { 
     new TestResizableFrame(); 
    } 

    public TestResizableFrame() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new FixedPane()); 
       frame.setResizable(false); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class FixedPane extends JPanel { 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Dimension size = getSize(); 
      String text = size.width + "x" + size.height; 
      FontMetrics fm = g.getFontMetrics(); 
      int x = (getWidth()- fm.stringWidth(text))/2; 
      int y = ((getHeight() - fm.getHeight())/2) + fm.getAscent(); 
      g.drawString(text, x, y); 
      g.setColor(Color.RED); 
      g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); 
     } 

    } 

}