我想在加载数据的过程中使用glassPane函数来停用面板中的元件。我知道glasspane只在框架中可用。在我的应用程序中,我没有访问框架的权限。我只想停用框架中的一个面板。
我试图通过覆盖面板的paint或paintComponent方法在面板上绘制一个三角形。问题是底层组件仍然可用。
有没有人能给我一个建议,我该如何解决这个问题?
问候
dbausnnd
发布于 2015-03-19 22:45:46
一种可能是--使用JLayeredPane包裹JPanel,然后激活位于其上的JPanel层,使其窃取焦点和MouseListener。例如:
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");
}
}));
}
}发布于 2015-03-19 22:46:02
在我的应用程序中,我没有访问框架的权限。我只想停用框架中的一个面板。
您可以始终使用:
Window frame = SwingUtilities.windowForComponent(...);我只想停用框架中的一个面板。
或者您可以尝试使用Disabled Panel。它允许您简单地禁用特定面板上的组件。
第二种绘制禁用外观的方法可能会有问题,因为在创建GUI时需要使用禁用面板。
发布于 2019-01-09 07:40:38
通过将glasspane包装在JRootPane的内容窗格中,可以将glasspane添加到JPanel。然后,您可以使用半透明的glasspane捕获鼠标和键盘事件,以便在数据加载期间将其停用,请参见https://tips4java.wordpress.com/2008/11/07/disabled-glass-pane/
https://stackoverflow.com/questions/29145472
复制相似问题