gpt4 book ai didi

Java Swing : Enabling/Disabling all components in JPanel

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:38:18 27 4
gpt4 key购买 nike

我有一个 JPanel,其中包含一个 JToolbar(包括几个没有文本的按钮)和一个 JTable,我需要启用/禁用(使内部小部件不可点击)。我试过这个:

 JPanel panel = ....;
for (Component c : panel.getComponents()) c.setEnabled(enabled);

但它不起作用。是否有更好、更通用的解决方案来启用/禁用 JPanel 中的所有内部组件?

从这里的示例开始,我已经使用 JLayer 部分解决了我的问题 http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html :

layer = new JLayer<JComponent>(myPanel, new BlurLayerUI(false));
.....
((BlurLayerUI)layer.getUI()).blur(...); // switch blur on/off


class BlurLayerUI extends LayerUI<JComponent> {
private BufferedImage mOffscreenImage;
private BufferedImageOp mOperation;

private boolean blur;

public BlurLayerUI(boolean blur) {
this.blur = blur;
float ninth = 1.0f / 9.0f;
float[] blurKernel = {
ninth, ninth, ninth,
ninth, ninth, ninth,
ninth, ninth, ninth
};
mOperation = new ConvolveOp(
new Kernel(3, 3, blurKernel),
ConvolveOp.EDGE_NO_OP, null);
}

public void blur(boolean blur) {
this.blur=blur;
firePropertyChange("blur", 0, 1);
}

@Override
public void paint (Graphics g, JComponent c) {
if (!blur) {
super.paint (g, c);
return;
}

int w = c.getWidth();
int h = c.getHeight();



if (w == 0 || h == 0) {
return;
}

// Only create the offscreen image if the one we have
// is the wrong size.
if (mOffscreenImage == null ||
mOffscreenImage.getWidth() != w ||
mOffscreenImage.getHeight() != h) {
mOffscreenImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
}

Graphics2D ig2 = mOffscreenImage.createGraphics();
ig2.setClip(g.getClip());
super.paint(ig2, c);
ig2.dispose();

Graphics2D g2 = (Graphics2D)g;
g2.drawImage(mOffscreenImage, mOperation, 0, 0);
}

@Override
public void applyPropertyChange(PropertyChangeEvent pce, JLayer l) {
if ("blur".equals(pce.getPropertyName())) {
l.repaint();
}
}

}

我还有两个问题:

  1. 在上面的链接中,事件仅与鼠标相关。如何管理键盘事件?

  2. 如何创建“灰色”效果来代替模糊?

最佳答案

它需要递归调用。

Disable All In Container

import java.awt.*;
import javax.swing.*;

public class DisableAllInContainer {

public void enableComponents(Container container, boolean enable) {
Component[] components = container.getComponents();
for (Component component : components) {
component.setEnabled(enable);
if (component instanceof Container) {
enableComponents((Container)component, enable);
}
}
}

DisableAllInContainer() {
JPanel gui = new JPanel(new BorderLayout());

final JPanel container = new JPanel(new BorderLayout());
gui.add(container, BorderLayout.CENTER);

JToolBar tb = new JToolBar();
container.add(tb, BorderLayout.NORTH);
for (int ii=0; ii<3; ii++) {
tb.add(new JButton("Button"));
}

JTree tree = new JTree();
tree.setVisibleRowCount(6);
container.add(new JScrollPane(tree), BorderLayout.WEST);

container.add(new JTextArea(5,20), BorderLayout.CENTER);

final JCheckBox enable = new JCheckBox("Enable", true);
enable.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
enableComponents(container, enable.isSelected());
}
});
gui.add(enable, BorderLayout.SOUTH);

JOptionPane.showMessageDialog(null, gui);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new DisableAllInContainer();
}
});
}}

关于Java Swing : Enabling/Disabling all components in JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10985734/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com