Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:GridLayout在完成调整大小之前调用layoutContainer_Java_Resize_Grid Layout - Fatal编程技术网

Java:GridLayout在完成调整大小之前调用layoutContainer

Java:GridLayout在完成调整大小之前调用layoutContainer,java,resize,grid-layout,Java,Resize,Grid Layout,我有一个简单的gui,其中包含使用GridLayout管理器的容器。 我添加了两个组件,它们继承了JComponent,并使用paintComponent在屏幕上绘制了一些东西 现在,我添加了componentListener,以使用GridLayout管理器调整gui的大小。 调整大小后,两个组件仍然很小,因此未调整大小 我通过创建GridLayout的简单副本来检查这一点,打印methode layoutContainer从父容器获得的大小,以查看在resize事件之后父容器是否具有新的大小

我有一个简单的gui,其中包含使用GridLayout管理器的容器。 我添加了两个组件,它们继承了JComponent,并使用paintComponent在屏幕上绘制了一些东西

现在,我添加了componentListener,以使用GridLayout管理器调整gui的大小。
调整大小后,两个组件仍然很小,因此未调整大小

我通过创建GridLayout的简单副本来检查这一点,打印methode layoutContainer从父容器获得的大小,以查看在resize事件之后父容器是否具有新的大小。 它打印的尺寸仍然很小,但变化不大,但不是正确的尺寸

我在layoutContainer中打印大小,并使用一个简单的计时器每秒打印父gui的大小

我意识到,在计时器打印出正确的1600x1099大小之前,GridLayout管理器中的layoutContainer会被调用为旧大小

我认为GridLayout总是根据行和列的配置自动调整其所有组件的大小。但是似乎没有,layoutContainer方法调用得太早了

是否有任何方法可以使用GridLayout管理器实现这一点,或者我必须自己调整组件的大小

如何检查LayoutManager中调用layoutContainer方法的时间和内容

下面是一个模块的代码,该模块的大小已正确调整,但其子组件(子类)的大小未正确调整,希望您不要使用太多代码:

信息:我在一个java文件中为这个模块编写了所有需要的类,所以我在一个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);
  }
}

一些想法:您是否在EventDispatchThread之外调用Swing方法?不要使用EventQueue.invokeLater或invokeAndWait。然后,似乎我们需要一个示例代码,因为它应该是开箱即用的。调整大小后,这两个组件仍然很小,所以没有调整大小。那么你做错了什么。我们猜不到。发布你的SSCCE演示问题。是的,我做错了,因为一个简单的JFrame和GridLayout,有2行1列和2个按钮,可以正确调整大小。我认为这与我的子组件有关。即使我将组件布局定义为GridLayout,子组件的大小也会正确调整。不知道为什么。好吧,事情变得很奇怪。通过单击并按住边框并调整其大小来调整窗口大小时,所有子构件的大小都会正确调整。唯一的问题是单击窗口右上角的最大化按钮。我检查了ComponentListener,它触发componentResized事件以进行最大化和手动调整大小。那么,问题是什么呢。手动调整大小是可行的,但最大化窗口不会导致调整子组件的大小。手动调整大小和最大化之间的唯一区别是,最大化窗口的大小仍然设置得很小。我可以做一些事情。由于我有一个时钟信号在后台运行,用于需要时间等的模块,所以我只调用我的组件或子组件的验证方法。validate方法根据组件的站点和parant容器检查组件是否有效,如果无效,则调用my GridLayout类的layout方法。解决了我的问题,但仍不清楚为什么这不会自动发生-