私がやろうとしていること:互いに垂直で、マウスが指している場所に接する垂直線と水平線を描きます。一種のカーソルトラッカー。
私の構造:JFrame->CustomPanel->他のパネル/コンポーネントなど。
CustomPanelはJPanelを継承し、JFrameのContentPaneとして設定されます。
GlassPaneを使用しようとしましたが、すべてが完全に機能しましたが、イベントを無効にするのではなく、保持したいと思います。それでもボタンなどをクリックできるようにしたい。
関連する質問は、Swingのコンポーネントの上にあるこのペイントですか?。CustomPanelの空の場所にマウスを移動すると、すべてが期待どおりに動作しますが、それでも他のコンポーネントの上にペイントされません。
画像では、ボタンの上にペイントを続ける必要がありましたが、ボタンを入力すると停止し、終了すると再開しました。
以下のコード。
public class Painter {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
JFrame frame = new JFrame();
frame.setSize(600, 600);
frame.setPreferredSize(new Dimension(600, 600));
frame.setContentPane(new CustomPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class CustomPanel extends JPanel {
int x = 0;
int y = 0;
public CustomPanel() {
addMouseListener(new AdapterImplementation(this));
addMouseMotionListener(new AdapterImplementation(this));
add(new JButton("TESTBTN"));
setSize(new Dimension(600, 600));
setPreferredSize(new Dimension(600, 600));
setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawLine(0, y, getWidth(), y);
g.drawLine(x, 0, x, getHeight());
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
}
と私のアダプター:
public class AdapterImplementation extends MouseAdapter {
CustomPanel pane;
public AdapterImplementation(CustomPanel pane) {
this.pane = pane;
}
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
pane.setX(x);
pane.setY(y);
pane.repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("MOUSE MOVED");
int x = e.getX();
int y = e.getY();
pane.setX(x);
pane.setY(y);
pane.repaint();
}
}