したがって、私の問題は、一部のコンポーネントの特定の領域のみがクリック可能であることです。私はこれらの3つのクラスを持っています:
TDUsersPanel
-- https://github.com/cats-/TD/blob/master/src/cats/td/gui/game/TDUsersPanel.javaTDSavedUsersPanel
-- https://github.com/cats-/TD/blob/master/src/cats/td/gui/game/TDSavedUsersPanel.javaTDRegisterPanel
-- https://github.com/cats-/TD/blob/master/src/cats/td/gui/game/TDRegisterPanel.java
そして、これはすべてが一緒に見えるもののイメージです:
しかし、ご覧のとおり、ピンク色の領域 (ピンク色の内側に追加しました) があり、ピンク色の領域はコンポーネントがクリック可能な場所を示しています。たとえば、登録ボタンを見ると、ボタンの上部にピンク色の領域があることがわかります。これは、ピンク色の領域の境界内でのみボタンをクリックできることを意味します。また、リストの右端にピンク色の領域が表示され、ピンク色の領域の境界内でクリックした場合にのみ動作することを示しています。
そして私の質問は、なぜこのように振る舞うのですか? 他のコンポーネントと同じように動作するようにしたいのですが、なぜ特定の領域からのみ適切に反応するのか非常に興味があります. 一部のコンポーネントが重複する可能性を考慮しましたが、すべてのコンポーネントの周りに境界線を引いた後、重複はまったくありません。
誰かが私の問題で私を助けて、可能な解決策を教えてくれたら、それは大歓迎です、ありがとう.
他にご不明な点がございましたら、お気軽にお問い合わせください。
編集:ちょっとした発見がありました。ボタンにマウスリスナーを追加して、ボタンの境界とクリックしている場所を出力してみました。次に、ボタンの境界にクリックしているポイントが含まれている場合は、次のようなステートメントを出力するという単純な if ステートメントを追加しました。
System.out.println(registerButton.getBounds());
System.out.println(e.getPoint());
System.out.println(registerButton.getBounds().contains(e.getPoint()));
出力例を次に示します。
java.awt.Rectangle[x=1,y=115,width=498,height=42]
java.awt.Point[x=383,y=47]
false
ご覧のとおり、境界内にあることを示す出力ステートメントはありません。このマウスリスナーは登録ボタンのみに追加され、登録ボタン内をクリックした場合にのみトリガーされるため、これは奇妙です。しかし、これは非常に奇妙ですが、登録ボタンの境界とクリックしたポイントを見て y の値を比較すると、それらは非常に異なるからです。ボタンをクリックできる y 値の範囲は 115 から 157 です。しかし、マウスの位置を表す y 値は 57 であり、もちろん 57 < 115 です。オフセットの問題のようです。これを修正する方法を知っている人はいますか?
注: 何かに気づいたと思います。マウスリスナーを登録パネルのみに追加し、登録パネルだけに追加し、登録パネルの左上隅をクリックしました(0,0であると予想されます)が、ポイントを印刷すると(3,30 )つまり、オフセットがあることを意味します。このオフセットにより、マウスはどこかではない場所にあると認識し、上部の領域のみがクリック可能になります。しかし、問題がわかったので、これを修正する方法がわかりません。どんなアイデアでも大歓迎です。