2016-05-28 10 views
0

私を混乱させる問題のためにいくつかの助けを得ることを望みます。getPreferredSize()はJFrameで動作します。なぜそれがフレームで動作しないのですか?

getPreferredSize()FrameおよびFrameで試験した。 Frameでは、getPreferredSize()はすべて0(幅と高さの両方)を返しますが、Frameではゼロ以外の数値を返します。

は、私が推奨サイズが設定されていない意味getPreferredSize()は、単に0を返すようにnolayout()方法、およびisPreferredSizeSet()戻りFALSE、で私のコーディングのどの部分を確認していません。

なぜ設定されていませんか?誰も助けることができますか?ありがとう。

以下は、この簡単なテストプログラムのコーディングです。

import java.awt.*; 
import javax.swing.*; 

public class test { 
public test(){ 
    JFrame frame = new JFrame("AbsoluteLayoutDemo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Container p = frame.getContentPane(); 
    p.setLayout(null); 
    JButton b1 = new JButton("one"); 
    p.add(b1); 
    Dimension size = b1.getPreferredSize(); 
    System.out.println("size width is "+size.width+" height is "+size.height); 
    JLabel label2 = new JLabel("Text-Only Label"); 
    p.add(label2); 
    size = label2.getPreferredSize(); 
    System.out.println("label size width is "+size.width+" height is "+size.height); 

    Insets insets = p.getInsets(); 
    frame.setSize(300 + insets.left + insets.right, 125 + insets.top + insets.bottom); 
    frame.setVisible(true); 
} 
public static void main(String[] args) { 
    test t = new test(); 
    nolayout(); 
}enter code here 



public static void nolayout() { 

    Frame f = new Frame(); 
    f.setLayout(null); 

    Insets its = f.getInsets(); 

    System.out.println("its left, "+its.left+" right, "+its.right+" top "+its.top+" bottom "+its.bottom); 

    f.setLocation(200, 100); 
    f.setSize(its.left+its.right+300,its.top+its.bottom+200); 

    Label l1 = new Label("Enter Integer to be added : ",Label.RIGHT); 
    TextField t1 = new TextField("0",10); 

    f.add(l1); 
    f.add(t1); 


    System.out.println("is l1 preferred size set "+l1.isPreferredSizeSet()); 
    Dimension sz = l1.getPreferredSize(); 
    l1.setBounds(its.left + 10, its.top + 10, sz.width, sz.height); 
    System.out.println("label 1 width "+sz.width+" height " +sz.height); 

    sz = t1.getPreferredSize(); 
    t1.setBounds(its.left + 100, its.top + 10, sz.width, sz.height); 
    System.out.println("Text 1 width "+sz.width+" height " +sz.height); 

    f.setVisible(true); 
    } 
} 

次のようにコマンドウィンドウの出力は次のようになります。

C:\JAVAPR>java test 
size width is 55 height is 26 
label size width is 88 height is 16 
its left, 0 right, 0 top 0 bottom 0 
is l1 preferred size set false 
label 1 width 0 height 0 
Text 1 width 0 height 0 enter code here 
+0

'p.setLayout(NULL);' 1)は、Java GUIは「異なるOS上で動作する必要があり、画面サイズ、異なるロケールに異なるPLAFsを用いて等画面解像度。したがって、ピクセルの完全なレイアウトには役立ちません。代わりに、レイアウトマネージャや[それらの組み合わせ](http://stackoverflow.com/a/5630271/418556)と[空白](http://stackoverflow.com/a/17874718/)のレイアウトパディングとボーダーを使用してください。 418556)。 2)「コードブロックの括弧の検出/修正」(http://meta.stackexchange.com/q/251795/155831)を参照して、修正できなくなった問題を解決してください。 –

+0

* "なぜフレームで動かないのですか?" * AWTベースなので、(少なくともあなた以外の)誰も見ていないのです。 –

+2

クロスポストを終了:http://www.coderanch.com/t/666218/java/java/getPreferredSize-works-JFrame-doesn-work – camickr

答えて

1

あなたはlayoutpack()Windowを指定するとgetPreferredSize()の結果は、信頼性があります。 hereのように、getPreferredSize()を上書きすることができます。

image

import java.awt.Dimension; 
import java.awt.Frame; 
import java.awt.GridBagLayout; 
import java.awt.Label; 
import java.awt.Panel; 
import java.awt.TextField; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

/** @see https://stackoverflow.com/posts/37501391/edit */ 
public class Test { 

    private void display() { 
     Frame f = new Frame(){ 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(320, 240); 
      } 
     }; 
     f.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     f.setLayout(new GridBagLayout()); 
     Panel p = new Panel(); 
     p.add(new Label("Test", Label.RIGHT)); 
     p.add(new TextField("Test", 10)); 
     f.add(p); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Test().display(); 
    } 
} 
関連する問題