2016-04-18 16 views
0

私は、画面の上部を占めるように設定パネルを取得しようとしていて、入力パネルと出力パネルが並べてあります。私はまた、テキスト領域をそれぞれ70文字の幅と30行の高さにすることを試みています。しかし、今は設定パネルがまったく表示されず、テキスト領域は幅が35文字、高さが2行しかありません。私が見つけたすべての例とチュートリアルに続きました。私は間違って何をしていますか?GridBagLayoutが正しくフォーマットされていません

public class BorderWrapper { 
    public static void main(String[] args) { 
     //Create frame 
     JFrame frame = new JFrame("Border Wrapper"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create main panel 
     MainPanel panel = new MainPanel(); 
     frame.getContentPane().add(panel, BorderLayout.NORTH); 

     //Display frame 
     Dimension minSize = new Dimension(650, 375); 
     frame.setPreferredSize(minSize); 
     frame.setMinimumSize(minSize); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 



public class MainPanel extends JPanel { 
    private static final Font INPUT_FONT = new Font("Monospaced", Font.PLAIN, 12); 

    private JTextArea inputArea, outputArea; 
    private JTextField titleField, topBorderField, sideBorderField; 

    public MainPanel() { 
     setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 

     //Set up config panel 
     JPanel configPanel = new JPanel(); 
     configPanel.setLayout(new BoxLayout(configPanel, BoxLayout.X_AXIS)); 
     configPanel.setMaximumSize(new Dimension(400, 200)); 

     titleField  = new JTextField(25); 
     titleField.setFont(INPUT_FONT); 
     topBorderField = new JTextField(1); 
     topBorderField.setFont(INPUT_FONT); 
     sideBorderField = new JTextField(4); 
     sideBorderField.setFont(INPUT_FONT); 

     configPanel.add(new JLabel("Title:")); 
     configPanel.add(titleField); 
     configPanel.add(new JLabel("Top border:")); 
     configPanel.add(topBorderField); 
     configPanel.add(new JLabel("Side border:")); 
     configPanel.add(sideBorderField); 

     c.gridwidth = 2; 
     c.gridx  = 0; 
     c.gridy  = 0; 
     add(configPanel, c); 

     //Set up Input panel 
     JPanel inputPanel = new JPanel(); 
     inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.Y_AXIS)); 
     inputArea = new JTextArea("Type or paste your stuff here . . ."); 
     inputArea.setFont(INPUT_FONT); 
     inputArea.setLineWrap(true); 
     inputArea.setWrapStyleWord(true); 
     inputArea.setColumns(75); 
     JScrollPane inputPane = new JScrollPane(inputArea); 
     inputPane.setMinimumSize(new Dimension(250, 400)); 

     JLabel inputLabel = new JLabel("Text Box"); 
     inputLabel.setAlignmentX(Component.CENTER_ALIGNMENT); 
     inputPanel.add(inputLabel); 
     inputPanel.add(inputPane); 
     inputPanel.setMinimumSize(new Dimension(250, 400)); 

     c.gridwidth = 1; 
     c.gridx  = 0; 
     c.gridy  = 1; 
     add(inputPanel, c); 

     //Set up Output panel 
     JPanel outputPanel = new JPanel(); 
     outputPanel.setLayout(new BoxLayout(outputPanel, BoxLayout.Y_AXIS)); 
     outputArea = new JTextArea(); 
     outputArea.setFont(INPUT_FONT); 
     outputArea.setLineWrap(true); 
     outputArea.setWrapStyleWord(true); 
     outputArea.setColumns(75); 
     JScrollPane outputPane = new JScrollPane(outputArea); 
     outputPane.setMinimumSize(new Dimension(250, 400)); 

     JLabel outputLabel = new JLabel("Wrapped Output"); 
     outputLabel.setAlignmentX(Component.CENTER_ALIGNMENT); 
     outputPanel.add(outputLabel); 
     outputPanel.add(outputPane); 
     outputPanel.setMinimumSize(new Dimension(250, 400)); 

     c.gridwidth = 1; 
     c.gridx  = 1; 
     c.gridy  = 1; 
     add(outputPanel, c); 
    } 
} 

もともと、私はそれは私が作ろうとしたレイアウトのほとんど意味を成していたように見えたことから、BorderLayoutのを使用しようとするつもりだったが、私はのBorderLayoutにそれらを設定すると、それはさらに悪い仕事をしました。 WESTおよびBorderLayout.EAST。

答えて

1

MainPanelでBorderLayoutを使用するようにプログラムを変更し、その他のわずかな変更を加えて見た目や感触を得てください。これが役立つかどうかを確認してください。

enter image description here

public class BorderWrapper { 
    public static void main(String[] args) { 
     // Create frame 
     JFrame frame = new JFrame("Border Wrapper"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Create main panel 
     MainPanel panel = new MainPanel(); 
     frame.getContentPane().add(panel); 

     // Display frame 
     Dimension minSize = new Dimension(650, 375); 
     frame.setPreferredSize(minSize); 
     frame.setMinimumSize(minSize); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class MainPanel extends JPanel { 
    private static final Font INPUT_FONT = new Font("Monospaced", Font.PLAIN, 12); 

    private JTextArea inputArea, outputArea; 
    private JTextField titleField, topBorderField, sideBorderField; 

    public MainPanel() { 
     setLayout(new BorderLayout()); 

     // Set up config panel 
     JPanel configPanel = new JPanel(); 
     configPanel.setLayout(new BoxLayout(configPanel, BoxLayout.X_AXIS)); 
     configPanel.setMaximumSize(new Dimension(400, 200)); 

     titleField = new JTextField(25); 
     titleField.setFont(INPUT_FONT); 
     topBorderField = new JTextField(1); 
     topBorderField.setFont(INPUT_FONT); 
     sideBorderField = new JTextField(4); 
     sideBorderField.setFont(INPUT_FONT); 

     configPanel.add(new JLabel("Title:")); 
     configPanel.add(titleField); 
     configPanel.add(new JLabel("Top border:")); 
     configPanel.add(topBorderField); 
     configPanel.add(new JLabel("Side border:")); 
     configPanel.add(sideBorderField); 

     add(configPanel, BorderLayout.NORTH); 

     // Set up Input panel 
     JPanel lowerPanel = new JPanel(new GridLayout(1, 1)); 
     JPanel inputPanel = new JPanel(); 
     inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.Y_AXIS)); 
     inputArea = new JTextArea("Type or paste your stuff here . . ."); 
     inputArea.setFont(INPUT_FONT); 
     inputArea.setLineWrap(true); 
     inputArea.setWrapStyleWord(true); 
     inputArea.setColumns(75); 
     JScrollPane inputPane = new JScrollPane(inputArea); 

     JLabel inputLabel = new JLabel("Text Box"); 
     inputLabel.setAlignmentX(Component.CENTER_ALIGNMENT); 
     inputPanel.add(inputLabel); 
     inputPanel.add(inputPane); 

     lowerPanel.add(inputPanel); 

     // Set up Output panel 
     JPanel outputPanel = new JPanel(); 
     outputPanel.setLayout(new BoxLayout(outputPanel, BoxLayout.Y_AXIS)); 
     outputArea = new JTextArea(); 
     outputArea.setFont(INPUT_FONT); 
     outputArea.setLineWrap(true); 
     outputArea.setWrapStyleWord(true); 
     outputArea.setColumns(75); 
     JScrollPane outputPane = new JScrollPane(outputArea); 

     JLabel outputLabel = new JLabel("Wrapped Output"); 
     outputLabel.setAlignmentX(Component.CENTER_ALIGNMENT); 
     outputPanel.add(outputLabel); 
     outputPanel.add(outputPane); 

     lowerPanel.add(outputPanel); 
     add(lowerPanel, BorderLayout.CENTER); 
    } 
} 
は、私はあなたがまだあなたが希望を得るためのGridBagConstraintsを使用して掲示コードにいくつかの変更を加えることができ、このformat.AnywaysのためのBorderLayoutを使用することが便利に感じたlook.Make以下で1に変更あなたはその違いを観察するでしょう。

1.BorderLayoutを使用してMainPanelをNORTHに整列させました。しかし、あなたのケースでは、コンポーネント全体がMainPanelに配置されますので、NORTHの代わりにcenter.Soに置きます。 、あなたは完全な入力と出力のパネルが表示されます)

MainPanel panel = new MainPanel(); 
     frame.getContentPane().add(panel, BorderLayout.CENTER); 

2.You(高さ= 375)

minSize = new Dimension(650, 375); 

あなたのコンポーネント(= 200 configPanel、外形寸法に親フレームの大きさを設定していますoutputPanel = 400)の合計高さは375以上です。高さを増やすtarentを約600に設定します。

3. configLayoutの代わりにconfigLayoutを使用してみます。

configPanel.setLayout(new GridLayout(1,6,5,0)); 

上記の3つの変更を既存のコードに行うと、期待される出力が得られます。これが明確になることを願っています。

+0

これは絶対に役立ちます!しかし、GridBagLayoutを使って元のコードで何がうまくいかなかったのか、それがうまくいかない理由を知ることができますか?私は本当にそれを使う方法を学びたいと思っています。なぜそれが私がそれを持っていたように働いていないのか分かりません。 – BrainFRZ

+0

上記の編集された回答(GridBagLayoutを使用してください)を参照してください。 –

+0

更新していただきありがとうございます! :) – BrainFRZ

関連する問題