Java - 等待组件显示

时间:2017-07-16 22:52:30

标签: java swing user-interface callback components

更新#3:在madProgrammer的建议之后,也许定时解决方案是最好的。但是没有回答这种奇怪的行为。 我理解组件没有立即显示,需要设置。

这里的问题是onShow方法,如果从onCreate调用它会正确执行,但是如果从回调方法“componentShown”调用则不起作用。

UPDATE#2:在fragmentContentPane上添加了componentListener,以查看实际显示此组件的时间以及 VALID

fragmentContentPane.addComponentListener(new ComponentAdapter(){

    public void componentShown(ComponentEvent e){

        if (e.getComponent().isValid()) System.out.println("SHOWN AND VALID!");
    }

});

更新 show方法现在在EDT中被调用。

public void show() throws InvocationTargetException, InterruptedException{

    SwingUtilities.invokeAndWait(new Runnable(){

        public void run(){
            System.out.println("Showing..");
            frame.setVisible(true);
        }
    });
}

到目前为止,问题仍然存在。

原帖:

我有这段代码:

import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class TEST {

    private JFrame frame;
    private JScrollPane contentPane;
    private JPanel contentViewport;

    private JScrollPane fragmentContentPane;
    private JPanel fragmentContentViewport;

    public TEST() throws InvocationTargetException, InterruptedException{

        SwingUtilities.invokeAndWait(new Runnable(){

            public void run(){

                onCreate();
            }
        });
    }

    public void onCreate(){

        System.out.println("On create!");
        frame=new JFrame();
        contentPane=new JScrollPane();
        contentViewport=new JPanel();
        contentPane.setViewportView(contentViewport);
        frame.setContentPane(contentPane);

        frame.addComponentListener(new ComponentAdapter(){

            public void componentShown(ComponentEvent e){

                onShow();
            }
        });
    }

    public void onShow(){

        System.out.println("On show!");
        fragmentContentViewport=new JPanel();
        fragmentContentPane=new JScrollPane(fragmentContentViewport);

        fragmentContentPane.addHierarchyListener(new HierarchyListener() {

            public void hierarchyChanged(HierarchyEvent e) {

                if (e.getChangeFlags()==HierarchyEvent.SHOWING_CHANGED && fragmentContentPane.isShowing()) {

                    System.out.println("Component is completely shown");
                }
            }
        });

        contentViewport.add(fragmentContentPane);
    }

    public void show(){

        frame.setVisible(true);
    }

    public static final void main(String[] args) throws InvocationTargetException, InterruptedException{

        TEST t=new TEST();

        t.show();
    }
}

任务很简单。我想知道fragmentContentPane何时被正确添加并完全显示。

使用此代码,这种情况永远不会发生,为什么?

如果onShow方法与onCreate一起在ThreadEvent 中调用,则一切正常,例如:

public TEST() throws InvocationTargetException, InterruptedException{

        SwingUtilities.invokeAndWait(new Runnable(){

            public void run(){

                onCreate();
                onShow();
            }
        });
    }

感谢任何帮助

0 个答案:

没有答案