我目前有一个JDialog通过createDialog()从我的实例调用方法创建JOptionPane:
JOptionPane pane = new JOptionPane(myPanel, JOptionPane.PLAIN_MESSAGE,JOptionPane.DEFAULT_OPTION, null, new Object[]{}, null);
dialog = pane.createDialog(null, "");
Run Code Online (Sandbox Code Playgroud)
我希望能够去除从标题栏JDialog通过调用setUndecorated(true)到JDialog,但我得到一个IllegalComponentStateException: The dialog is displayable例外,当我尝试运行我的程序.
据我所知,在我调用之前没有显示对话框dialog.show(),这使我相信在实例化对话框之后,对话框确实是"可显示的",pane.createDialog()远远超出了我对JDialogAPI的理解.
我试图setVisible(false)在使用之前打电话setUndecorated(true),但无济于事.
任何帮助将被理解为如何或完全可以删除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();
Run Code Online (Sandbox Code Playgroud)
Mad*_*mer 12
您需要阅读Component#isDisplayable上的JavaDoc条目,然后查看create对话框的源代码
"当一个组件被添加到可显示的包含层次结构中或者当其包含层次结构可显示时,它就可以显示.当一个包含层次结构被打包或可见时,它 可以显示."
基本上,对话框作为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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6928 次 |
| 最近记录: |