2009-03-07 3 views
2

私はJavaで私の試験プロジェクト(D用)のような焦土を作っていますが、この問題があります。私はウィンドウ(JFrame)を描画し、レイアウトをBorderLayoutに設定し、拡張JPanelを適用し、ウィンドウをパッキングしますが、パッキングされた後、左と下の境界にいくつかの拡張された空白が表示されます。Java Swingがウィンドウを間違ってパックします

これは私のメインクラスです:

public class Main { 
    public static void main(String[] args) { 
     javax.swing.JFrame frame = new javax.swing.JFrame("game title"); 
     panel p = new panel(new java.awt.Dimension(512, 512)); 
     frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new java.awt.BorderLayout()); 
     frame.getContentPane().add(p, java.awt.BorderLayout.CENTER); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setVisible(true); 
    } 
} 

パネルはコンストラクタで、それは引数(512×512)の推奨サイズです設定された私のJPanelクラス、です。私はWindowsとLinuxの両方でこれをテストしましたが、両方の場所でエラーが発生しました。また、ホワイトギャップのサイズはOSによって異なります。

これは私のパネルクラスです:

class panel extends javax.swing.JPanel{ 
    panel(java.awt.Dimension size){ 
     setPreferredSize(size); 
    } 
    public void paint(java.awt.Graphics g){ 
     g.setColor(java.awt.Color.BLUE); 
     g.fillRect(0, 0, 512, 512); 
    } 
} 

助けてください!

私は(よりよい名前を必要とし、少なくともキャメルケースを使用して命名されなければならない)あなたの panelクラスせずにこれを再現しようとした
+0

あなたはあなたのパネルクラスについて教えてくれませんでした。それは何をするためのものか?コンストラクタ引数は何をしますか?問題をSSCCEに還元できますか? http://www.sscce.org/ –

+0

提供されたPanelクラスに問題はありません。また、2つの場所でパネルの望ましいサイズをハードコーディングすることによってあなた自身を繰り返します。それをしないでください! –

+1

私は矩形のサイズを設定するために使用しているウィンドウのサイズを持つ変数を持っています。 – Xunil

答えて

2

私はsetResizable(false)を削除して問題を解決しました。

助けてくれてありがとう!

+1

私は同じ問題を抱えていて、setResizableメソッドも削除して解決しました。しかし、ウィンドウがサイズ変更されないようにする別の方法はありますか? – fjsj

3

import javax.swing.*; 

public class Main { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("game title"); 
     JPanel p = new JPanel(); 
     p.setPreferredSize(new java.awt.Dimension(512, 512)); 
     p.setBackground(java.awt.Color.BLUE); 
     frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new java.awt.BorderLayout()); 
     frame.getContentPane().add(p, java.awt.BorderLayout.CENTER); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setVisible(true); 
    } 
} 

これはそれにブルー512×512パネルでウィンドウを生成し、異なった色の境界線はありません。だから問題はあなたのpanelクラスでなければなりません。

+0

私はそれをやっているとき、私は青い窓をすべて手に入れましたが、522x522のサイズで... – Xunil

+0

522x522とは何ですか?窓?またはパネル?私のパネルはちょうど512x512ですが、ウィンドウは明らかにそれより少し大きいです。 –

+0

それは522x522のパネルです – Xunil

3

SAUA、

これは、あなたが尋ねたものではありませんが、それは決して少なく...あなたはスイングに塗料を上書きしませんが重要です。代わりにpaintComponentを上書きします。

参照Sunの「カスタムペイント」チュートリアル:http://java.sun.com/docs/books/tutorial/uiswing/painting/

実際に、私は強く示唆(プロジェクトの選択を考慮して)あなたは全体のSwingのチュートリアルを通過します。それは "しばらく"かかるが、それは時間の価値がある。

乾杯。キース。

+0

Hyキース、私はOPではなかった、それはXunilだった;-) –

1

私はsetResizable()のコードを見て、すべてが正しいことを理解しました。 this.setResizable(false)this.pack()の前に入れてください。

関連する問題