Java:GridLayout在完成调整大小之前调用layoutContainer
我有一个简单的gui,其中包含使用GridLayout管理器的容器。 我添加了两个组件,它们继承了JComponent,并使用paintComponent在屏幕上绘制了一些东西 现在,我添加了componentListener,以使用GridLayout管理器调整gui的大小。Java:GridLayout在完成调整大小之前调用layoutContainer,java,resize,grid-layout,Java,Resize,Grid Layout,我有一个简单的gui,其中包含使用GridLayout管理器的容器。 我添加了两个组件,它们继承了JComponent,并使用paintComponent在屏幕上绘制了一些东西 现在,我添加了componentListener,以使用GridLayout管理器调整gui的大小。 调整大小后,两个组件仍然很小,因此未调整大小 我通过创建GridLayout的简单副本来检查这一点,打印methode layoutContainer从父容器获得的大小,以查看在resize事件之后父容器是否具有新的大小
调整大小后,两个组件仍然很小,因此未调整大小 我通过创建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方法。解决了我的问题,但仍不清楚为什么这不会自动发生-