Tôi có một JPanel chứa một thanh công cụ JToolbar (bao gồm một vài nút không có văn bản) và JTable và tôi cần bật/tắt (làm cho các tiện ích bên trong không thể nhấp). Tôi đã thử điều này:Java Swing: Bật/Tắt tất cả các thành phần trong JPanel
JPanel panel = ....;
for (Component c : panel.getComponents()) c.setEnabled(enabled);
nhưng nó không hoạt động. Có một giải pháp tốt hơn và chung chung hơn để cho phép/vô hiệu hóa tất cả các thành phần bên trong trong một JPanel?
Tôi đã phần nào giải quyết vấn đề của tôi sử dụng JLayer bắt đầu từ ví dụ ở đây 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();
}
}
}
tôi vẫn còn có 2 vấn đề:
1) Trong liên kết trên các sự kiện có liên quan đến con chuột duy nhất. Làm thế nào tôi có thể quản lý các sự kiện bàn phím?
2) Làm cách nào để tạo hiệu ứng "màu xám" thay cho làm mờ?
Bạn có thể thiết lập khả năng hiển thị của bảng điều khiển trực tiếp bằng cách sử dụng 'panel.setVisible (false)' –
setVisible (false) làm cho các thành phần " vô hình "nhưng thực sự tôi cần nó vẫn hiển thị nhưng có màu xám. – Randomize
hiện chủ đề này có giúp ích gì không? http://stackoverflow.com/a/305551/1417974 –