2017-04-13 2 views
0

SwingでFlowLayoutマネージャを使用して単純なオブジェクトを配置しようとしています。JPanelはJFrameの全領域を取ります

私は基本的に小さなプログラムを作成しました。フレームのサイズを設定してから、いくつかのJLabelを作成し、次にJPanelを作成しました。

私はJPanelを300x300のsetSizeに置き、それを視覚的に見るために赤色に変更しました。しかし、それはJFrameの全領域を占め、setsizeはそれに影響を与えないようです。

私は間違っていますか?私はそれをグーグルで試して、コードをいくつか変更しましたが、運はありません。私も読んだが、明らかに正確に理解していない、オラクルのコード... 助けてください。下は私のコードです。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Toolkit; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Main extends JFrame{ 

    public String frameTitle, projectNameString, countryNameString, projectDetailString, requestDateString; 
    private int offerRevisionVal; 
    private Toolkit toolkit; 


    // UPPER OBJECTS 
    //private JLabel projectLabel, countryLabel, projectDetailLabel, offerLabel, requestDateLabel, emptyLabel; 


    public Main(){ 

     frameTitle = "CRANES QUOTATIONS"; 

     // MAIN INSTANCE VARIABLES DEFINITION 
     projectNameString = "Project Title"; // TO ADD LATER 
     countryNameString = "Brazil"; // TO ADD LATER 
     projectDetailString = "32 Cranes biTravi"; // TO ADD LATER 
     offerRevisionVal = 01; // TO ADD LATER 
     requestDateString = "20-April-2017"; // tTO ADD LATER 

     this.setTitle(frameTitle); 

     JPanel panel = new JPanel(); 
     panel.setBackground(Color.red); 
     panel.setSize(new Dimension(300,300)); 


     //projectLabel = new JLabel(projectNameString); 
     //countryLabel = new JLabel(countryNameString); 
     //projectDetailLabel = new JLabel(projectDetailString); 
     //offerLabel = new JLabel(String.valueOf(offerRevisionVal)); 
     //requestDateLabel = new JLabel(requestDateString); 




     this.add(panel);    
     // =========================================================================== 
     this.setSize(800, 300); // set the height and width of my window 
     this.centerToScreen(); 
     this.setVisible(true); // set visibility 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); // sets up what it does when I close the App. 

    } 

    // Method to center to screen 
    public void centerToScreen(){ 

     toolkit = getToolkit(); 
     Dimension size = toolkit.getScreenSize(); // gets the screen size 
     setLocation(size.width/2 - getWidth()/2, size.height/2 - getHeight()/2); // sets the location 
    } 


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

      @Override 
      public void run() { 
       new Main(); 

      } 

     }); 


    } 
    } 
+0

[レイアウトマネージャのビジュアルガイド](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)と[コンテナ内のコンポーネントのレイアウト] (http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) – MadProgrammer

+0

これは私が検索した最初の場所です。しかし、そこにはパブロが述べている問題は言及されていない。私はそれが論理がcomportamentalバグによって上書きされたらそれが嫌い....正しい道を学ぶのは難しい。私は仕事から帰ってきて、それがうまくいくことを願って、今晩勉強します。 – zypa

+1

他の場所は、「JFrame'のためのJavaDocs」(https://docs.oracle.com/javase/8/docs/api/javax/swing/JFrame.html)です。*「デフォルトのコンテンツペインにBorderLayoutマネージャが設定されます "* – MadProgrammer

答えて

1

JFrameデフォルトLayoutManagerとしてBorderLayout使用しています。だから、暗黙のうちにあなたのJFrameFlowLayoutへのレイアウトを設定する必要があります。

this.setLayout(new FlowLayout()); 

あなたはまた、あなたのpanelのコンテナ(JFrame)が非nullである場合setSize()は効果がありませんので、setPreferredSize()の代わりに、あなたのpanelsetSize()を使用する必要がありますLayoutManager

+2

[Java Swingでset(Preferred | Maximum | Minimum)サイズメソッドを使用しないでください。](http://stackoverflow.com/questions/7229226/should-i) -avoid-use-of-setpreferredmaximumminimumizeize-java-swi) – MadProgrammer

+0

はい、これは実際には機能しました。私はJFrameにFlowLayoutを設定し、次にJPanelsを追加し、PreferredSizeを使用してサイズを設定しました。すべては今働いている。再度、感謝します – zypa

関連する問題