2017-07-07 4 views
1

私は単純なJavaプログラムを持っています。実行すると、Eclipseに3つのJButtonが表示されます。ボタンは、レイアウトの配置を変更するように設定されています。左と右を整列させるには左を押し、中央を整列するには右と中央を整列させます。Javaプログラムは、ウィンドウがリサイズされるまで反応しません。

ボタンはこれを行いますが、サイズを変更するまで、ウィンドウ内のアライメントは変更されません。

Iveはjdkとeclipseの両方を更新しようとしましたが、違いはありません。コード自体に問題がないことがわかりました。

誰でもこの理由を知っていますか?

import javax.swing.JFrame;

public class Main { 
    public static void main(String []args){ 

     Layout_buttonsAndActionEvents layout = new Layout_buttonsAndActionEvents(); 

     layout.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     layout.setSize(300,300); 
     layout.setVisible(true); 



    } 

} 



import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class Layout_buttonsAndActionEvents extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JButton leftButton; 
    private JButton rightButton; 
    private JButton centerButton; 

    private FlowLayout layout; 
    private Container container; 

    public Layout_buttonsAndActionEvents(){ 
     super("The Title"); 
     layout = new FlowLayout(); 
     container = new Container(); 
     setLayout(layout); 


     leftButton = new JButton("Left"); 
     add(leftButton); 
    //Align to the left 
     leftButton.addActionListener(new ActionListener(){ 

      public void actionPerformed(ActionEvent event){ 
       layout.setAlignment(FlowLayout.LEFT); 
       layout.layoutContainer(container); 
      } 
     }); 


    centerButton = new JButton("Center"); 
    add(centerButton); 

    //Align to the right 
     centerButton.addActionListener(new ActionListener(){ 

       public void actionPerformed(ActionEvent event){ 
        layout.setAlignment(FlowLayout.CENTER); 
        layout.layoutContainer(container); 
       } 
      }); 

     rightButton = new JButton("Right"); 
     add(rightButton); 

     //Align to the right 
      rightButton.addActionListener(new ActionListener(){ 

       public void actionPerformed(ActionEvent event){ 
        layout.setAlignment(FlowLayout.RIGHT); 
        layout.layoutContainer(container); 
       } 
      }); 



    } 


} 
+1

アライメントを変更した後にウィンドウを再パックしますか? –

+2

コードを投稿できますか? –

+1

コメントには入れないでください。質問を編集して質問に追加することができます。 – byxor

答えて

1

あなたが本当にへの呼び出しでのJFrameのコンテンツ ペイン(アドオン経由()メソッドにボタンを追加しているのでカバーの下にある getContentPane()。add())コンテンツウィンドウ枠 でrevalidate()を呼び出す必要があります。 3つのアクションリスナー、変更に

layout.setAlignment(FlowLayout.XXX); 
    layout.layoutContainer(container); 

へ:

layout.setAlignment(FlowLayout.XXX); 
    getContentPane().revalidate(); 

また、あなたはそれがあなたの例では何もしないと「コンテナ」という名前の変数へのすべての参照を削除することができます。

+1

ありがとう、これが修正されました – Yzma

0

JFrameのサイズを変更すると、新しいサイズとレイアウトで再検証されます。同様に、視覚的な違いを適用するために変更されたレイアウトを追加した後、フレームを検証してフレームを再ペイントする必要があります。

レイアウトを変更した後、この順序でこれらのメソッドを呼び出すようにしてください:

setLayout(layout); 
repaint(); 
revalidate(); 
+0

これはメインまたはレイアウトクラスに追加されますか? – Yzma

+0

@ Yzmaアクションリスナーに入ります。 "frame"を 'JFrame'オブジェクトの名前に置き換えてください。 –

+0

ウィンドウのサイズが変更された後でもまだアライメントが変更されています。あなたがしたことに変更されたことを確信しています。 – Yzma

関連する問題