我正在集成一个小程序,我需要破解其中一个对话框并更改其模式。
我的问题是我不懂 Swing,而且我的尝试在实践中没有效果。
当前实施:
dialog.setModalExclusionType(ModalExclusionType.TOOLKIT_EXCLUDE);
dialog.repaint();
也试过
dialog.setModal(false);
所以有我的问题。如何动态更改现有 JDialog 的模态?
不知道你想做什么......但也许你可以从这里得到一些东西
public class Mainz extends JFrame implements ActionListener{
JButton showDialog = new JButton("show dialog");
public Mainz() {
setLayout(new FlowLayout());
showDialog.addActionListener(this);
add(showDialog);
setSize(200, 300);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
new Dialogz(this, false);
setEnabled(false);
}
public static void main(String[]args){
new Mainz();
}
}
class Dialogz extends JDialog{
JButton close = new JButton("close");
public Dialogz(JFrame owner,boolean modal) {
super(owner, modal);
setSize(100, 200);
add(close);
setLocationRelativeTo(owner);
setVisible(true);
close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae){
closez();
}
});
}
void closez(){
setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
System.out.println("modal exclusion befor = "+getModalExclusionType());
setModalExclusionType(ModalExclusionType.NO_EXCLUDE);
System.out.println("modal exclusion after = "+getModalExclusionType());
System.out.println("modality before ="+getModalityType());
setModal(true);
System.out.println("modality after ="+getModalityType());
getOwner().setEnabled(true);
Dialogz.this.dispose();
}
}
要更改您的对话框是模态的还是无模态的,请使用setModalityType
方法。
setModal(true)
,模态类型与呼叫相同setModalityType(Dialog.DEFAULT_MODALITY_TYPE)
。默认值为ModalityType.APPLICATION_MODAL
。setModal(false)
,模态类型设置为ModalityType.MODELESS
。当您更改其模式时,该对话框应该不可见。否则,直到对话框被隐藏然后再次显示时才会生效。
此外,必须对对话框本身进行编程以支持不同的模态模式。
dialog.setVisible(true)
并且此方法在对话框关闭之前不会返回。然后使用对话框中的数据。dialog.setVisible(true)
立即返回(在屏幕上显示对话框之后)。在对话框中按下按钮通常会对其他窗口和对话框产生一些影响。您可以在显示对话框时与应用程序的其他窗口进行交互。如果您需要更多帮助,我可以向您展示一个带有对话框的工作示例,该示例可以在两种模式下工作:模态和非模态。
一个黑客黑客:
您可以通过调用私有方法来更改现有对话框的模式:
java.awt.Dialog.hideAndDisposePreHandler();
调用这个私有方法——例如:
private void executeMethod(final Class<?> clazz, final String methodName, final Object instance)
{
final Method method =
Iterables.getOnlyElement(Iterables.filter(
Arrays.asList(clazz.getDeclaredMethods()), new Predicate<Method>()
{
public boolean apply(final Method method)
{
return method.getName().equals(methodName);
}
}));
method.setAccessible(true);
try
{
method.invoke(instance);
}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e)
{
throw Throwables.propagate(e);
}
}
(此代码需要番石榴)
最后称之为:
final Dialog myDialog = ...;
executeMethod(Dialog.class, "hideAndDisposePreHandler", myDialog);
我猜你还没有获得AWTPermission.toolkitModality
你的小程序的许可。
另一个问题可能是您的平台不支持排除类型 - 您可以使用Toolkit.isModalExclusionTypeSupported(java.awt.Dialog.ModalExclusionType)
.