Mam JPanel, który zawiera JToolbar (w tym kilka przycisków bez tekstu) i JTable i muszę włączyć/wyłączyć (uniemożliwić kliknięcie wewnętrznych widgetów). Próbowałem tego:Java Swing: Włączanie/wyłączanie wszystkich składników w JPanel
JPanel panel = ....;
for (Component c : panel.getComponents()) c.setEnabled(enabled);
ale to nie działa. Czy istnieje lepsze i bardziej ogólne rozwiązanie umożliwiające włączanie/wyłączanie wszystkich wewnętrznych komponentów w JPanelu?
mam częściowo rozwiązać mój problem za pomocą JLayer zaczynając od przykładu tutaj 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();
}
}
}
nadal mam 2 problemy:
1) w linku powyżej zdarzeń są względne tylko myszy. Jak mogę zarządzać wydarzeniami na klawiaturze?
2) Jak mogę utworzyć efekt "szarego" zamiast rozmycia?
Można ustawić widoczność panelu bezpośrednio za pomocą 'panel.setVisible (false)' –
setVisible (fałsz) sprawia, że komponent " niewidzialny ", ale w rzeczywistości potrzebuję go wciąż widocznego, ale szarego. – Randomize
robi w ogóle tę pomoc? http://stackoverflow.com/a/305551/1417974 –