[英]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
將組件移到彼此前面。
這是一個教程: 如何使用分層窗格
禁用玻璃窗格可能會幫助您。
還不清楚代碼的組織方式。 但是,聽起來您可能想要模態對話框。 這是帶有大量參考資源的類似討論的鏈接。
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.