Java Swing: включение/отключение всех компонентов в JPanel

У меня есть 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(myPanel, new BlurLayerUI(false));
.....
((BlurLayerUI)layer.getUI()).blur(...); // switch blur on/off


class BlurLayerUI extends LayerUI {
  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();
    }
  }

}

У меня все еще есть 2 проблемы:

  1. В приведенной выше ссылке события относятся только к мыши. Как я могу управлять событиями клавиатуры?

  2. Как создать эффект «серого» вместо размытия?

6
задан Ahmed Ashour 11 April 2019 в 16:41
поделиться