在 JPanel 中使用 GlassPane [英] Using a GlassPane in a JPanel
问题描述
我想使用 glassPane 函数在加载数据期间停用面板中的组件.我知道玻璃板仅适用于框架.在我的应用程序中,我无法访问框架.我只想停用框架中的单个面板.
i want to use a glassPane function to deactivate Components in a Panel during the loading of data. I know the the glasspane is only available in frames. In my application i have no access to the frame. I just want to deactivate a single panel in the frame.
我试图通过覆盖面板的paint或paintComponent方法在面板上绘制一个ractangle.问题是底层组件仍然可用.
I tried to draw a ractangle over the panel by overriding the paint or paintComponent method of the panel. The problem is that the underlaying components are still available.
谁能给我一个建议,我该如何解决这个问题?
could anyone give me an advice how i can solve this problem?
问候
dbausnnd
推荐答案
一种可能性——使用 JLayeredPane 包裹你的 JPanel,然后激活它上面的 JPanel 层,让它窃取焦点和 MouseListener.例如:
One possibility -- use a JLayeredPane to wrap around your JPanel, and then activate a JPanel layer that is held above it, having it steal the focus and the MouseListener. For example:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import javax.swing.*;
public class MyGlassPaneWrapper extends JLayeredPane {
private JPanel glassPanel = new JPanel();
public MyGlassPaneWrapper(JComponent myPanel) {
glassPanel.setOpaque(false);
glassPanel.setVisible(false);
glassPanel.addMouseListener(new MouseAdapter() {});
glassPanel.setFocusable(true);
myPanel.setSize(myPanel.getPreferredSize());
add(myPanel, JLayeredPane.DEFAULT_LAYER);
add(glassPanel, JLayeredPane.PALETTE_LAYER);
glassPanel.setPreferredSize(myPanel.getPreferredSize());
glassPanel.setSize(myPanel.getPreferredSize());
setPreferredSize(myPanel.getPreferredSize());
}
public void activateGlassPane(boolean activate) {
glassPanel.setVisible(activate);
if (activate) {
glassPanel.requestFocusInWindow();
glassPanel.setFocusTraversalKeysEnabled(false);
}
}
private static void createAndShowGui() {
final MyPanel myPanel = new MyPanel();
final MyGlassPaneWrapper myGlassPaneWrapper = new MyGlassPaneWrapper(myPanel);
final String activateGlassPane = "Activate GlassPane";
final String deactivateGlassPane = "Deactivate GlassPane";
JToggleButton toggleButton = new JToggleButton(activateGlassPane);
toggleButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
AbstractButton source = (AbstractButton) e.getSource();
if (e.getStateChange() == ItemEvent.SELECTED) {
source.setText(deactivateGlassPane);
myGlassPaneWrapper.activateGlassPane(true);
} else {
source.setText(activateGlassPane);
myGlassPaneWrapper.activateGlassPane(false);
}
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(toggleButton);
JFrame frame = new JFrame("MyGlassPane");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(myGlassPaneWrapper);
frame.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class MyPanel extends JPanel {
public MyPanel() {
add(new JTextField(5));
add(new JComboBox<String>(new String[]{"Monday", "Tuesday", "Wednesday"}));
add(new JButton(new AbstractAction("Push Me") {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(MyPanel.this, "Button Pushed");
}
}));
}
}
这篇关于在 JPanel 中使用 GlassPane的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!