【问题标题】:Translucent loading overlay for JFrameJFrame 的半透明加载覆盖
【发布时间】:2014-03-15 11:15:58
【问题描述】:

我有一个包含各种组件的 JFrame,我想在应用程序初始化各种东西时在顶部添加一个半透明的灰色覆盖。理想情况下,它会阻止与底层组件的交互,并且能够显示一些“正在加载...”文本或旋转轮或类似的东西。

有使用 Java 和 Swing 的简单方法吗?

【问题讨论】:

  • 你可以看看使用 JXLayer/JLayer 之类的东西,它可以让你改变组件的绘制方式。看看this example,它会禁用一个容器。它就像组件的玻璃面板,但具有附加功能......

标签: java swing


【解决方案1】:

正如@David 所说,您可以使用玻璃窗格在应用程序的其余部分上方显示一些加载文本或图像。

至于灰色覆盖:为什么不使用内置功能来禁用组件,只要您的应用程序正在加载?禁用的组件将自动变灰,用户无法与之交互。

类似这样的:

public class LoadingFrame extends JFrame{

JButton button;
public LoadingFrame() {
    button = new JButton("ENTER");
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Application entered");
        }
    });
    setLayout(new BorderLayout());
    add(button, BorderLayout.CENTER);
}


public void startLoading(){
    final Component glassPane = getGlassPane();
    final JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    final JLabel label = new JLabel();
    panel.add(label, BorderLayout.SOUTH);
    setGlassPane(panel);
    panel.setVisible(true);
    panel.setOpaque(false);
    button.setEnabled(false);

    Thread thread = new Thread(){
        @Override
        public void run() {
            for (int i = 5; i > 0; i--) {
                label.setText("Loading ... " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
                            // loading finished
            setGlassPane(glassPane);
            button.setEnabled(true);
        }
    };
    thread.start();
}

public static void main(String[] args) {
    LoadingFrame frame = new LoadingFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 500);
    frame.startLoading();
    frame.setVisible(true);
}
}

【讨论】:

    【解决方案2】:

    看看 JRootPane 和 JLayeredPane http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#layeredpane

    您要问的具体内容听起来像是玻璃窗格。 http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane

    Glass Pane 可防止与底层组件进行交互,并可用于在 JFrame 之上显示某些内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多