0

GridLayout Manager を使用したコンテナーを備えた単純な GUI があります。JComponent から継承する 2 つのコンポーネントを追加し、paintComponent を使用して画面にいくつかのものを描画します。

ここで、GridLayout Manager を使用して GUI のサイズを変更するために componentListener を追加しました。サイズ変更後、2 つのコンポーネントはまだ小さいので、サイズ変更しません。

メソッドlayoutContainerが親コンテナから取得しているサイズを印刷するGridLayoutの単純なコピーを作成して、親が新しいサイズを持っているかどうかを確認することでこれを確認しました(サイズ変更イベントの後)。小さな変更でまだ小さいサイズで印刷されますが、正しいサイズではありません。

layoutContainer のサイズを出力し、単純なタイマーを使用して毎秒親 GUI のサイズを出力します。

Timer が正しいサイズ (1600x1099) を出力する前に、GridLayout Manager の layoutContainer が古いサイズで呼び出されることに気付きました。

行と列の構成に従って、GridLayout は常にすべてのコンポーネントのサイズを自動的に変更していると思いました。しかし、そうではないようです。layoutContainer メソッドが呼び出されるのが早すぎます。

GridLayout Manager を使用してこれを正しく行う方法はありますか、または自分でコンポーネントのサイズを変更する必要がありますか?

LayoutManager で layoutContainer メソッドを呼び出すタイミングと内容を確認するにはどうすればよいですか?

正しくサイズ変更されるモジュールのコードを次に示しますが、サブクラスであるそのサブコンポーネントは正しくサイズ変更されません (コードが多すぎないことを願っています)。

情報: このモジュールに必要なすべてのクラスを 1 つの Java ファイルに記述したので、必要なものはすべて 1 つの Java ファイルに含まれています。

public class Main extends Module {

  // ############### MAIN PAGE COMPONENT ##############
  public class MainPage extends ModulePageContainer {
    // ############### CLOCK COMPONENT ##############
    public class ClockComponent extends JComponent {
      private Date              currentDateTime;
      private SimpleDateFormat  dateFormat;

      public ClockComponent() {
        this.dateFormat = new SimpleDateFormat( "HH:mm");
      }

      @Override
      protected void paintComponent( Graphics g) {
        super.paintComponent( g);
        //...doing some paint stuff here...
      }

      public void setDateTime( Date dateTime) {
        this.currentDateTime = dateTime;
      }
    }
    // ############### CLOCK COMPONENT END ##############

    // ############### MAIN INFO COMPONENT ##############
    public class MainInfoComponent extends JComponent {   
      public MainInfoComponent() {
        this.setLayout( null);
      }

      @Override
      protected void paintComponent( Graphics g) {
        super.paintComponent( g);
        // ... just empty subcomponent ...
      }
    }

    // ############### MAIN INFO COMPONENT END ##############

    private ClockComponent    clock;
    private MainInfoComponent mainInfo;

    public MainPage( Module parent) {
      super( parent);
      this.clock = new ClockComponent();
      this.mainInfo = new MainInfoComponent();
      this.setLayout( new MyGridLayout( 2, 1));
      this.add( this.clock);
      this.add( this.mainInfo);
    }

    public void clockTick( Date date) {
      this.clock.setDateTime( date);
      this.repaint();
    }
  }

  // ############### MAIN PAGE COMPONENT END ##############    
  public Main( String name) {
    super( name);
  }

  @Override
  public void init() {
    // every module has pages, this module has only one page called 'main'
    MainPage mainPage = new MainPage( this);
    mainPage.setName( "main");
    this.addPage( mainPage);
  }
}
4

0 に答える 0