以下の例では、(イベントを送信することによって) ウィンドウを表示、非表示、破棄、および閉じることができます。
例は、ウィンドウが一度だけ開かれることを示しました-最初に表示されたセットで。ウィンドウが破棄され、再度表示されても、「開く」イベントは発生しません。
なんで?
ハンドラを記述してこのイベントを追跡せずにウィンドウが開いているかどうかを知る方法は?
ウィンドウを閉じて、セットが表示されたときに再び開くイベントが発生するようにするにはどうすればよいですか? つまり、ウィンドウ オブジェクトを初期状態に戻す方法は?
必要なプロパティを持つことができる他の状態またはイベントはありますか?
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.ListDataListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Tester_JFrame_Closing_01 {
private static Logger log = LoggerFactory.getLogger(Tester_JFrame_Closing_01.class);
protected static Toolkit toolkit = Toolkit.getDefaultToolkit();
protected static EventQueue eventQueue = toolkit.getSystemEventQueue();
public static enum CloseOperation {
DO_NOTHING_ON_CLOSE(JFrame.DO_NOTHING_ON_CLOSE),
HIDE_ON_CLOSE(JFrame.HIDE_ON_CLOSE),
DISPOSE_ON_CLOSE(JFrame.DISPOSE_ON_CLOSE),
EXIT_ON_CLOSE(JFrame.EXIT_ON_CLOSE)
;
public static ComboBoxModel newModel() {
return new ComboBoxModel() {
private CloseOperation selected = HIDE_ON_CLOSE;
@SuppressWarnings("serial")
private final AbstractListModel core = new AbstractListModel() {
@Override
public int getSize() {
return values().length;
}
@Override
public Object getElementAt(int index) {
return values()[index];
}
};
@Override
public int getSize() {
return core.getSize();
}
@Override
public Object getElementAt(int index) {
return core.getElementAt(index);
}
@Override
public void addListDataListener(ListDataListener l) {
core.addListDataListener(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
core.removeListDataListener(l);
}
@Override
public void setSelectedItem(Object anItem) {
selected = (CloseOperation) anItem;
}
@Override
public Object getSelectedItem() {
return selected;
}
};
}
public final int Value;
private CloseOperation(int value) {
this.Value = value;
}
@Override
public String toString() {
switch(this) {
case DISPOSE_ON_CLOSE:
return "DISPOSE_ON_CLOSE";
case HIDE_ON_CLOSE:
return "HIDE_ON_CLOSE";
case DO_NOTHING_ON_CLOSE:
return "DO_NOTHING_ON_CLOSE";
case EXIT_ON_CLOSE:
return "EXIT_ON_CLOSE";
default:
return "<UNKNOWN>";
}
}
}
public static void main(String[] args) {
WindowAdapter windowAdapter = new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
log.debug("windowClosed");
}
@Override
public void windowClosing(WindowEvent e) {
log.debug("windowClosing");
}
@Override
public void windowOpened(WindowEvent e) {
log.debug("windowOpened");
}
};
final JFrame frame = new JFrame("Controlled window");
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.addWindowListener(windowAdapter);
final WindowEvent closeEvent = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
@SuppressWarnings("serial")
AbstractAction closeAction = new AbstractAction("close") {
@Override
public void actionPerformed(ActionEvent e) {
eventQueue.postEvent(closeEvent);
}
};
@SuppressWarnings("serial")
AbstractAction hideAction = new AbstractAction("hide") {
@Override
public void actionPerformed(ActionEvent e) {
frame.setVisible(false);
}
};
@SuppressWarnings("serial")
AbstractAction showAction = new AbstractAction("show") {
@Override
public void actionPerformed(ActionEvent e) {
frame.setVisible(true);
}
};
@SuppressWarnings("serial")
AbstractAction disposeAction = new AbstractAction("dispose") {
@Override
public void actionPerformed(ActionEvent e) {
frame.dispose();
}
};
JButton closeButton = new JButton(closeAction);
JButton hideButton = new JButton(hideAction);
JButton showButton = new JButton(showAction);
JButton disposeButton = new JButton(disposeAction);
ComboBoxModel closeOperationModel = CloseOperation.newModel();
final JComboBox closeOperationCombo = new JComboBox(closeOperationModel);
closeOperationCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
log.debug("closeOperationCombo.actionPerformed({})", e);
frame.setDefaultCloseOperation(((CloseOperation)closeOperationCombo.getSelectedItem()).Value);
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(showButton);
buttonPanel.add(hideButton);
buttonPanel.add(disposeButton);
buttonPanel.add(closeButton);
buttonPanel.add(closeOperationCombo);
JFrame controlFrame = new JFrame("Controller window");
controlFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
controlFrame.setLayout(new FlowLayout());
controlFrame.add(buttonPanel, BorderLayout.SOUTH);
controlFrame.pack();
controlFrame.setLocation(100, 100);
controlFrame.setVisible(true);
frame.setBounds(100, 100 + controlFrame.getHeight(), controlFrame.getWidth(), 480);
}
}
信じられない
Window.state
彼らは、初期化さえしないという名前のフィールドを持っています(したがって、それはゼロです)。次に、show()
メソッドで一度テストし1
、それが0
. 使う場所state
はここだけで、ここwindowOpened
がクビになっています。どこにもstate
戻るコードはありません。さらに、サブクラスでこの変数0
を放棄し、同じ名前の新しい変数でオーバーライドします。この変数は、アイコン化されたものや類似のものを含むいくつかの新しい状態をビットごとに保持し、開いたビットを忘れます! 涼しい!state
Frame