別のJOptionPaneダイアログの上にJOptionPaneダイアログを配置する方法を知っている人はいますか?
3 に答える
これにはJDialogsを使用します。これにより、コードの実行方法と表示方法をもう少し制御できると思います。ただし、JOptionPanesを使用して実行することもできます。たとえば、JOptionPaneにJButtonを表示した場合、そのActionListenerによって別のJOptionPaneが表示されます。
たとえば、
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class NestedJOptions {
public static void main(String[] args) {
final JPanel panel = new JPanel();
panel.add(new JButton(new AbstractAction("Push Me") {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(panel, "hello world!");
}
}));
JOptionPane.showMessageDialog(null, panel);
}
}
編集: @Hovercraft Full of Eels は、より良いソリューションを提供します。OPが探していた可能性が高いです。
JOptionPane javadocs から:
すべてのダイアログはモーダルです。各 showXxxDialog メソッドは、ユーザーの操作が完了するまで呼び出し元をブロックします。
いいえ、必要な機能を で実現することはできませんJOptionPane
。ただしJOptionPane
、一般的に遭遇するいくつかJDialog
の を作成するための便利なクラスです。必要な機能は s によって直接サポートされていないため、JOptionPane
s を使用して直接実装することを検討する必要がありますJDialog
。例えば:
public class DialogTest {
static final SimpleDateFormat SDF = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");
public static void main(String[] args) {
final JFrame frame = new JFrame("Dialog test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createPanelToPopDialog(frame));
frame.setSize(500, 200);
frame.show();
}
static JPanel createPanelToPopDialog(final JFrame parent) {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
JButton button = new JButton("Pop a Dialog");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JDialog dialog = new JDialog(parent, true);
dialog.add(createPanelToPopDialog(parent));
dialog.setSize(500, 200);
dialog.show();
}
});
panel.add(button, BorderLayout.SOUTH);
panel.add(new JLabel("Created at " + SDF.format(new Date())));
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
return panel;
}
}
あなたはそれを試してみて、いくつかの問題に遭遇しましたか、それともただ尋ねているだけですか? JOptionPane はモーダルであるため、それが作成されたスレッドをブロックします。複数の JOptionPane を表示する複数のスレッドを生成できます。
for (int i = 0; i < 5; i++) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, "I'm thread " + Thread.currentThread().getId());
}
});
t.start();
}
ただし、swing イベントを受信できるメッセージ ダイアログは 1 つだけです。表示された順序でそれらを閉じる必要があります (これはランダムです)。