- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前有一个 JDialog
,它是通过从我的 JOptionPane
实例调用 createDialog()
方法创建的:
JOptionPane pane = new JOptionPane(myPanel, JOptionPane.PLAIN_MESSAGE,JOptionPane.DEFAULT_OPTION, null, new Object[]{}, null);
dialog = pane.createDialog(null, "");
我希望能够通过调用 JDialog
上的 setUndecorated(true)
从 JDialog
中删除标题栏,但是我得到了当我尝试运行我的程序时出现 IllegalComponentStateException: The dialog is displayable
异常。
据我所知,在我调用 dialog.show()
之前,对话框没有显示,这让我相信通过 实例化对话框时,对话框确实是“可显示的” code>pane.createDialog()
远远超出了我对 JDialog
API 的理解。
我试图在使用 setUndecorated(true)
之前调用 setVisible(false)
,但无济于事。
对于如何或完全有可能删除此类 JDialog
的标题栏的任何帮助,我们将不胜感激。从普通的 JDialog
中删除标题栏很容易,从许多其他此类问题的答案中可以看出,但我似乎无法让它为 JDialog
工作通过 createDialog()
创建。
相关代码:
input= new JTextField(50);
input.addKeyListener(new ConsoleKeyListener());
input.addAncestorListener( new RequestFocusListener() );
field = new JTextArea();
field.setEditable(false);
field.setLineWrap(true);
JScrollPane area = new JScrollPane(field, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
field.setRows(10);
field.setText(consoleText);
JPanel myPanel = new JPanel();
myPanel.setLayout(new BorderLayout(0,0));
myPanel.add(input, BorderLayout.PAGE_END);
myPanel.add(area, BorderLayout.PAGE_START);
input.setFocusable(true);
input.requestFocus();
int result = 101;
//int result = JOptionPane.showOptionDialog(null, myPanel,"", JOptionPane.DEFAULT_OPTION,JOptionPane.PLAIN_MESSAGE, null, new Object[]{}, null);
JOptionPane pane = new JOptionPane(myPanel, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, new Object[]{}, null);
dialog = pane.createDialog(null, "");
dialog.setVisible(false);
dialog.setUndecorated(true);
//dialog.undecorated = true;
//dialog.setOpacity(0.55f);
removeMinMaxClose(dialog);
removeMinMaxClose(pane);
removeMinMaxClose(myPanel);
dialog.getRootPane().setOpaque(false);
//JDialog dialog = new JDialog();
//dialog.setVisible(false);
//dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//myPanel.setUndecorated(true);
//dialog.setUndecorated(true);
//dialog.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
//dialog.setBounds( 100, 100, 300, 200 );
dialog.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.out.println("yo");
}
});
dialog.setVisible(true);
dialog.show();
最佳答案
您需要阅读 JavaDoc entry on Component#isDisplayable , 然后看看创建对话框的源代码
"A component is made displayable either when it is added to a displayable containment hierarchy or when its containment hierarchy is made displayable. A containment hierarchy is made displayable when its ancestor window is either packed or made visible."
基本上,对话框被打包为 createDialog
方法的一部分
可能的解决方案
一个可能的解决方案是创建您自己的对话框...
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Frame;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestOptionPane11 {
public static void main(String[] args) {
new TestOptionPane11();
}
public TestOptionPane11() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final JDialog dialog = new JDialog((Frame)null, "Boo");
JOptionPane op = new JOptionPane("Look ma, no hands", JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
op.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String name = evt.getPropertyName();
if ("value".equals(name)) {
dialog.dispose();
}
}
});
dialog.setUndecorated(true);
dialog.setLayout(new BorderLayout());
dialog.add(op);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
});
}
}
关于java - setUndecorated(true) 到从 JOptionPane 实例创建的 JDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17100587/
import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.UIManager; import javax.sw
在我的 Swing 应用程序中,我希望能够在装饰和未装饰之间切换,而无需重新创建整个框架。但是,API 不允许我在框架可见后调用 setUndecorated()。 即使我调用 setVisible(
我正在构建一个桌面应用程序,需要使用外部 JFrame 来为用户容纳各种绘图工具。 这是我当前的 JFrame 的样子: ![在此处输入图像描述][1] 这是类(class): public clas
在我的应用程序中,通过按钮查看我显示一个jframe(未装饰、MAXIMIZED_BOTH、Visible 和alwaysOnTop),然后经过一段时间后,当我完成它的工作后,我将其从按钮设置为不可见
我有这两个 JFrame,当 setUndecorated 设置为 false 时,它们工作得很好,但当它设置为 true 时,它不能始终如一地工作; frame = new JFrame("
我目前有一个 JDialog,它是通过从我的 JOptionPane 实例调用 createDialog() 方法创建的: JOptionPane pane = new JOptionPane(myP
在下面的代码片段中,除非您从代码片段中删除一行代码,否则不会调用 WindowClosing 事件。要删除的代码行是: jFrame.setUndecorated(true); 显然这个 setUnd
我是一名优秀的程序员,十分优秀!