JFrameでJTableを右クリックすると、JPopupMenuが表示されます。このJPopupMenuをそのまま表示したまま、マウスを使用してJTableに移動した場合でも、その行にカーソルを合わせることができます。
これは、Windowsアプリケーションのデフォルトの動作ではありません。通常、ポップアップメニューがプログラムに表示されると、ポップアップ所有者ウィンドウでのホバーアクションがブロックされます。
Javaでも同じことができますか?
JFrameでJTableを右クリックすると、JPopupMenuが表示されます。このJPopupMenuをそのまま表示したまま、マウスを使用してJTableに移動した場合でも、その行にカーソルを合わせることができます。
これは、Windowsアプリケーションのデフォルトの動作ではありません。通常、ポップアップメニューがプログラムに表示されると、ポップアップ所有者ウィンドウでのホバーアクションがブロックされます。
Javaでも同じことができますか?
この問題に対処する 1 つの方法は、GUI 要素の 1 つにインスタンス変数を設定して、ホバー イベントを有効にするかどうかをフラグすることです。これがどのように機能するかを以下に示しましたが、完全な形式ではありません。JPopupMenu が閉じられたときにホバーを再度有効にし、ENABLE_HOVER
ホバー効果を発生させる前にフィールドの状態を確認する必要もあります。
public MyTable extends JTable {
private boolean ENABLE_HOVER = true;
public MyTable() {
...
this.addMouseListener(new MouseListener(){
...
public void mouseClicked(MouseEvent e) {
if (isRightClick(e)) {
setHoverEnabled(false);
showJPopupMenu();
}
}
});
}
protected void setHoverEnabled(final boolean hover) {
this.ENABLE_HOVER = hover;
}
}
多数の有効な要素を無効にするのにより適した別の方法は、ガラス ペインでイベントをインターセプトすることです。これがどのように機能するかの例をここに示します。ただし、インターフェイスが既に構築されている場合は、コンポーネント クラスの大幅な再調整が必要になる可能性があることに注意してください。
ガラス ペインですべてのイベントをインターセプトする必要があります。ホバーが有効になっている場合 (ポップアップ メニューが表示されていない場合)、イベントを適切なコンポーネントに渡します。それ以外の場合、ホバーが無効で、JPopupMenu で発生した MouseEvent は JPopupMenu にのみ渡されます。