将JPanel带到java中的其他对象(SWING)前面
我想在应用程序进程时进行加载,所以我在JTree上使用了JPanel。 但是当用户点击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(); } }); } }
编辑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);
您需要使用JLayeredPane
将组件移到彼此前面。
这是一个教程: 如何使用分层窗格
残疾人玻璃窗可能会帮助你。
你的代码组织方式还不是很清楚。 但是,听起来你可能想要的是一个modal dialog。 以下是与许多引用资源进行类似讨论的链接。
如何在Swing java中创建JFrame模型
使用JXLayer
或JIDE Overlayable
。
Jpanel main = new JPanel(); Jpanel a = new JPanel(); JPanel b = new Jpanel(); main.add(a); main.add(b);
此时的对象:
a -> 0 ( index) b -> 1 (index) main.getComponentCount() = 2 main.setComponentZorder(b,0); a -> 1 b -> 0; b OVER a DOWN