Вот проблема: когда я включаю переход по щелчку, мой JFrame становится невидимым для события мыши. Я не могу фиксировать щелчки мыши непосредственно на кадре, так как окно игнорирует все события мыши, поскольку оно прозрачно.
Чего я пытаюсь достичь:< /p>
- Мне нужно включить переход по щелчку в окне, чтобы можно было щелкнуть по расположенным ниже окнам через мой фрейм.
- В то же время я хочу обнаруживать щелчки мыши внутри и снаружи
фрейм. - После обнаружения щелчка мне нужно временно отключить функцию перехода по клику, чтобы фрейм мог зафиксировать щелчок, а затем снова включить ее.
Код: Выделить всё
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.Native;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class ClickThroughExample {
private JFrame frame;
public ClickThroughExample() {
frame = new JFrame("ClickThrough Example");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setBackground(Color.BLUE);
frame.add(panel);
frame.setVisible(true);
SwingUtilities.invokeLater(() -> {
try {
enableClickThrough();
bringWindowToFront(); // Bring window to the front
} catch (Exception e) {
e.printStackTrace();
}
});
panel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
Point p = e.getPoint();
if (frame.getBounds().contains(p)) {
System.out.println("Click detected inside the JFrame: " + p);
} else {
System.out.println("Click detected outside the JFrame: " + p);
}
disableClickThrough(); // Temporarily disable click-through
SwingUtilities.invokeLater(() -> {
try {
enableClickThrough(); // Re-enable click-through
} catch (Exception ex) {
ex.printStackTrace();
}
});
}
}
});
}
public HWND getHwnd() {
if (!frame.isDisplayable()) {
throw new IllegalStateException("Component must be displayable");
}
return new HWND(Native.getComponentPointer(frame));
}
public void enableClickThrough() {
HWND hwnd = getHwnd();
int exStyle = User32.INSTANCE.GetWindowLong(hwnd, User32.GWL_EXSTYLE);
exStyle |= User32.WS_EX_LAYERED | User32.WS_EX_TRANSPARENT;
User32.INSTANCE.SetWindowLong(hwnd, User32.GWL_EXSTYLE, exStyle);
User32.INSTANCE.SetLayeredWindowAttributes(hwnd, 0, (byte) 255, User32.LWA_ALPHA);
}
public void disableClickThrough() {
HWND hwnd = getHwnd();
int exStyle = User32.INSTANCE.GetWindowLong(hwnd, User32.GWL_EXSTYLE);
exStyle &= ~(User32.WS_EX_LAYERED | User32.WS_EX_TRANSPARENT);
User32.INSTANCE.SetWindowLong(hwnd, User32.GWL_EXSTYLE, exStyle);
}
public void bringWindowToFront() {
HWND hwnd = getHwnd();
User32.INSTANCE.SetForegroundWindow(hwnd);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(ClickThroughExample::new);
}
Проблема: код должен обеспечивать возможность перехода по клику, но при этом фиксировать щелчки мыши внутри и за пределами фрейма. . Однако окно остается невидимым для событий мыши, когда включен режим перехода по щелчку, и клики не фиксируются.
Любые предложения по устранению этой проблемы и правильной обработке событий мыши на прозрачное окно с включенным переходом по клику?
Подробнее здесь: https://stackoverflow.com/questions/792 ... click-thro