我想在app进程时加载,所以我在JTree上使用了JPanel.但是当用户点击JPanel时,JTree将选择并且JPanel会转到后面.隐藏jpanel之后它再也没有显示出来(我不知道为什么!但它似乎永远不会出现在jtree上).
我需要一种方法来让JPanel前进.我怎样才能做到这一点?
另外我必须提到我不想要JDialog.我想使用任何元素的jpanel顶部来显示加载,直到进程完成.
解决方法
所以这里至少有两个解决方案.或者选择@Geoff和@sthupahsmaht建议的内容. BTW也可以使用JOptionPane,它会自动为您创建一个对话框.
另一种选择是使用框架中的GlassPane.
或者另一个选择是使用JLayeredPane作为@jzd建议.
编辑:
示例显示如何使用GlassPane捕获用户选择.
请尝试以下步骤:
1.左键点击开始时可见的玻璃窗格.查看输出.
2.点击它.这隐藏了玻璃窗格.
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(); } }); } }
EDIT2:
如果您希望获得对话框的效果,可以通过将此代码合适地合并到我的示例中来实现.
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);