2016-09-14 7 views
0

右下にボタンを取得しようとしていますが、テキストフィールドは左下を占めていますが、何らかの理由で切り替えが続いています。私はその境界線が馬鹿だと思う。私はJava btwのノブです。ここに私のコードは次のとおりです。Java.Swing BorderLayoutの問題

package textchat; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.*; 

public class window extends JFrame{ 
    public static void main(String[] args) 
    { 
     new window(); 
    } 

    public window() 
    { 

     //Window Config 
     //JFrame frame = new JFrame(); 
     Toolkit tk = Toolkit.getDefaultToolkit(); 
     Dimension dm = tk.getScreenSize(); 
     this.setSize(400,400); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setTitle("CALI V1"); 
     this.setExtendedState(this.getExtendedState() | JFrame.MAXIMIZED_BOTH); 
     //this.setLayout(null); 
     int Width = this.getWidth(); 


     //Panel(s) 
     JPanel Panel = new JPanel(); 
     Panel.setLayout(new BorderLayout()); 
     JPanel PanelSouth = new JPanel(); 
     JPanel PanelEast = new JPanel(); 
     JPanel PanelWest = new JPanel(); 
     //button 
     JButton btn = new JButton("SEND"); 

     //Text Area 
     JTextArea txt = new JTextArea(100 , 100); 
     txt.setText("TEXT IS HERE"); 

     //Text Field 
     JTextField fld = new JTextField("Type Here",15); 

     //Adding to the panel 
     Panel.add(txt); 
     PanelSouth.add(PanelEast, BorderLayout.EAST); 
     PanelSouth.add(PanelWest, BorderLayout.WEST); 
     PanelEast.add(btn); 
     PanelWest.add(fld); 
     //adding to frame 
     this.add(Panel); 
     this.add(PanelSouth , BorderLayout.SOUTH); 



     this.setVisible(true); 



    } 


} 
+1

あなたは 'BorderLayout'するPanelSouth''上のレイアウトを設定することはありません。 – resueman

+0

ああ、ありがとう、私はJavaでnoobだと私はそれのようなものを逃した知っていた。とても有難い。 –

+1

1)一般的なJava命名法(命名規則 - 例えば 'EachWordUpperCaseClass'、' firstWordLowerCaseMethod() '、' firstWordLowerCaseAttribute'が 'UPPER_CASE_CONSTANT'でない限り)を学び、一貫して使用してください。 2) 'JTextArea txt = new JTextArea(100,100);'これらの値は幅Xの高さ(ピクセル単位)ではなく、列X行であることに注意してください。 3)すべてのコンポーネントが追加された後は常に 'pack()'を呼び出します。 4)EDT上でGUIを起動する必要があります。そうしないと、予期しない結果が発生します。 –

答えて

0

作品のような方法の一種でのBorderLayoutを使用しているとき、あなたは ような方法でそれを使用するべきではありません。また、あなたの例にはいくつかの問題があります。 たとえば、EDT(Event Dispatch Tread)でアプリケーションを起動していないとします。

ここでは、あなたのintededレイアウトを作成する作業例です。これは強力なGroupLayoutマネージャを使用します。

package com.zetcode; 

import java.awt.Container; 
import java.awt.EventQueue; 
import javax.swing.GroupLayout; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class TextChatEx extends JFrame { 

    public TextChatEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JTextArea area = new JTextArea(15, 15); 
     JTextField field = new JTextField(15); 
     JButton sendButton = new JButton("Send"); 

     createLayout(area, field, sendButton); 

     setTitle("Text chat"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 

     Container pane = getContentPane(); 
     GroupLayout gl = new GroupLayout(pane); 
     pane.setLayout(gl); 

     gl.setAutoCreateContainerGaps(true); 
     gl.setAutoCreateGaps(true); 

     gl.setHorizontalGroup(gl.createParallelGroup() 
       .addComponent(arg[0]) 
       .addGroup(gl.createSequentialGroup() 
         .addComponent(arg[1]) 
         .addComponent(arg[2])) 
       ); 

     gl.setVerticalGroup(gl.createSequentialGroup() 
       .addComponent(arg[0]) 
       .addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(arg[1]) 
         .addComponent(arg[2]))     
     ); 

     pack(); 
    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(() -> { 
      TextChatEx ex = new TextChatEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

GroupLayoutは、強力なレイアウトマネージャです。このマネージャーでは、いくつかの基本的なレイアウトを作成するためのパネルをたくさん作成する必要はありません。

public TextChatEx() { 

     initUI(); 
    } 

GUI作成はinitUI()メソッドに委譲されています。すべてのコードをコンストラクタに配置するのではなく、特殊なメソッドを使用します。

EventQueue.invokeLater(() -> { 
     TextChatEx ex = new TextChatEx(); 
     ex.setVisible(true); 
    }); 

各SwingアプリケーションはEDTに配置する必要があります。これをしないと、将来的にバグを見つけにくくなる可能性があります。

enter image description here

関連する問題