我有一个包含各种组件的JFrame,我想在应用程序初始化各种内容时在顶部添加半透明的灰色覆盖。理想情况下,它会阻止与底层组件的交互,并能够显示一些“正在加载...”文本或旋转轮或类似的东西。
使用Java和Swing有一种简单的方法吗?
答案 0 :(得分:4)
正如@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);
}
}
答案 1 :(得分:3)
看看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上显示某些内容。