解决swing-组件模态框1的问题:
如果在蒙层下方的内容使用setEnable方法 可以实现模态框弹出时,内容区域被禁用的效果,但是效果不太好
思路
使用JXLayer的lockableUI 实现第一层禁止点击效果. 当然使用JLayer +layerUI也可以.
java1.7的JLayer 同JXLayer效果差不多,但是JXLayer自带几种UI效果
效果
在弹出模态框的时候,第一层还是锁的状态,但是样式不再改变
代码
直接对ModalPaneTest进行二次测试
import com.formdev.flatlaf.FlatLightLaf;
import com.mynote.core.util.FrameUtil;
import com.mynote.core.util.MaskUtil;
import javax.swing.*;
/**
* 模态框效果
*/
public class ModalPanelTest2 extends ModalPanelTest {
private JComponent enableLockContent;
@Override
protected JComponent createContent() {
enableLockContent=super.createContent();
return MaskUtil.lockComp(enableLockContent,false);
}
/**
* 绑定事件
*/
@Override
protected void bindEvents() {
getShowModal().addActionListener((e) -> {
getModalMask().setVisible(true);
getModalContent().setVisible(true);
MaskUtil.lockComp(enableLockContent, true);
});
getCloseModal().addActionListener((e) -> {
getModalMask().setVisible(false);
getModalContent().setVisible(false);
MaskUtil.lockComp(enableLockContent, false);
});
}
public static void main(String[] args) {
FlatLightLaf.install();
FrameUtil.launchTest(new ModalPanelTest2());
}
}
MaskUtil.lockComp
<dependency>
<groupId>org.swinglabs</groupId>
<artifactId>jxlayer</artifactId>
<version>3.0.4</version>
</dependency>
private static Map<JComponent, LockableUI> lockLayers = new HashMap<JComponent, LockableUI>();
/**
* 是否锁定组件
*
* @param comp
* @param isLocked
* @return
*/
public static JComponent lockComp(final JComponent comp, final boolean isLocked) {
LockableUI lockableUI;
String lockLog = isLocked ? "lock" : "unlock";
if (lockLayers.containsKey(comp)) {
lockableUI = lockLayers.get(comp);
if (lockableUI != null) {
lockableUI.setLocked(isLocked);
log.debug("store {} comp:{}", lockLog, comp.hashCode());
}
return comp;
} else {
lockableUI = new LockableUI();
lockableUI.setLockedCursor(Cursor.getDefaultCursor());
lockLayers.put(comp, lockableUI);
final JXLayer<JComponent> layer = new JXLayer<JComponent>(comp, lockableUI);
lockableUI.setLocked(isLocked);
log.debug("new {} comp:{}", lockLog, comp.hashCode());
return layer;
}
}