簡體   English   中英

將JPanel帶到Java中其他對象的前面(SWING)

[英]Bring JPanel to front of other objects in java (SWING)

我想在應用程序處理時發出加載消息,因此我在JTree使用了JPanel 但是,當用戶單擊JPanel ,將選擇JTree ,並且JPanel將轉到后面。 隱藏JPanel ,它將不再顯示。 我不知道為什么,但是似乎它永遠不會出現在JTree前面。

我需要一種將JPanel置於一切之上的方法。 我怎樣才能做到這一點?

編輯:另外,我必須提到,我不需要JDialog 我想在任何元素之上使用JPanel來顯示加載消息,直到過程完成為止。

因此,這里至少有兩個解決方案。 要么按照@Geoff和@sthupahsmaht的建議去做。 順便說一句,也可以使用JOptionPane,它會自動為您創建一個對話框。

另一種選擇是使用框架中的GlassPane。

或另一個選擇是使用@@ zzd建議的JLayeredPane。

編輯:顯示如何使用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();
            }
        });
    }
}

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);

您需要使用JLayeredPane將組件移到彼此前面。

這是一個教程: 如何使用分層窗格

禁用玻璃窗格可能會幫助您。

還不清楚代碼的組織方式。 但是,聽起來您可能想要模態對話框。 這是帶有大量參考資源的類似討論的鏈接。

如何在Swing Java中制作JFrame模態

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

對於那些使用JDialog沒問題的人,這是一種確定的方法,可以在出現問題時顯示它。 只要確保對話框是模態對話框,布置,設置焦點等時正確控制它即可。

JDialog dialog = new JDialog();
dialog.setAlwaysOnTop(true);

使用JXLayer或JIDE Overlayable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM