我想在应用程序处理时发出加载消息,所以我使用JPanel了a JTree.但是当用户点击时JPanel,JTree将会选择并将JPanel返回到后面.隐藏后JPanel,它再也没有显示出来.我不知道为什么,但它似乎永远不会走在前面JTree.
我需要一种方法来把JPanel所有东西都带到前面.我怎样才能做到这一点?
编辑:另外我必须提到我不想要一个JDialog.我想使用JPanel任何元素的顶部来显示加载消息,直到进程完成.
所以这里至少有两个解决方案.或者选择@Geoff和@sthupahsmaht建议的内容.BTW也可以使用JOptionPane,它会自动为您创建一个对话框.
另一种选择是使用框架中的GlassPane.
或者另一个选择是使用JLayeredPane作为@jzd建议.
编辑: 显示如何使用GlassPane捕获用户选择的示例.请尝试以下步骤:
1.左键点击开始时可见的玻璃窗格.查看输出.
2.点击它.这隐藏了玻璃窗格.
3.左键单击内容窗格.查看输出.
4.点击它.转到第1点.享受.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class OverPanel extends JPanel
{
private static void createAndShowGUI()
{
final JFrame f = new JFrame();
f.setPreferredSize(new Dimension(400, 300));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel glassPanel = new JPanel();
glassPanel.setBackground(Color.RED);
glassPanel.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
super.mousePressed(e);
System.out.println("f.getGlassPane() mousePressed");
if(e.getButton() == MouseEvent.BUTTON3)
f.getGlassPane().setVisible(false);
}
});
f.setGlassPane(glassPanel);
f.getContentPane().setBackground(Color.GREEN);
f.getContentPane().addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
super.mousePressed(e);
System.out.println("f.getContentPane() mousePressed");
if(e.getButton() == MouseEvent.BUTTON3)
f.getGlassPane().setVisible(true);
}
});
f.getGlassPane().setVisible(true);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:如果你想要一个对话框的效果,你可以通过将这个代码适当地合并到我的例子中来实现它.
JPanel panel = new JPanel(new GridLayout(0, 1));
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
panel.setBackground(Color.YELLOW);
panel.add(new JLabel("I am message Label"));
panel.add(new JButton("CLOSE"));
JPanel glassPanel = new JPanel(new GridBagLayout());
glassPanel.setOpaque(false);
glassPanel.add(panel);
Run Code Online (Sandbox Code Playgroud)