[英]Need help positioning in java
我創建了這個java程序,我想要一個輸出,如果int x和int y大於100,它會繪制一個矩形。 但事實並非如此。 我怎樣才能使它工作?我需要添加另一行代碼嗎? 這是我的代碼:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class GameSetup extends JPanel implements MouseMotionListener{
public static JFrame njf = new JFrame("Test");
public static int x, y;
public static void main(String[] args){
GameSetup gs = new GameSetup();
njf.add(gs);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
this.setBackground(Color.BLACK);
g.setColor(Color.GREEN);
g.fillRect(150, 75, 200, 100);
g.setColor(Color.ORANGE);
g.drawString("Play", 239, 123);
njf.addMouseListener(new MouseAdapter() {
public void mouseMoved(MouseEvent e) {
x = e.getX();
y = e.getY();
}
});
if(x > 100 && y > 100){
g.drawRect(10, 10, 100, 100);
}
}
public GameSetup(){
njf.setSize(500,500);
njf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
njf.setResizable(false);
njf.setLocationRelativeTo(null);
njf.setVisible(true);
}
@Override
public void mouseDragged(MouseEvent arg0) {
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
好的,上面包含的代碼有幾個問題。
第一個讓我感到高興的是你將鼠標動作監聽器添加到框架的方式。 這有很多問題。
首先,你在paintComponent
方法中這樣做,如果它起作用,它仍被認為是不好的做法,因為paintComponent
方法可能被多次調用。 正如評論所指出的那樣,在專家組的構造函數中這樣做。
第二個是你將鼠標監聽器添加到框架而不是面板,因為面板位於框架的“上方”,所以它不起作用,因此只能在面板中識別鼠標事件。 這里最好的選擇是將MouseMotionListener直接添加到面板本身。
第三個是你在GameSetup
類中實現MouseMotionListener
接口,但實際上從未對這個實現做任何事情。 所以我做的是我擺脫了內部類,並且讓面板成為它自己的MouseMotionListnener
代碼的第二個問題是paintComponent
方法僅在某些時間點被調用(參見此內容 )。 這意味着即使鼠標可能已在區域內移動,也不會調用paintComponent方法來相應地更新屏幕。 為此,您需要為面板調用repaint
方法。
第三個是您沒有為面板設置大小,默認值是0x0,因此您需要設置面板的大小(應該與框架本身相同)(如果您想保留默認布局)。
所有這些都說,這是我修復的代碼。 我添加了一個名為enteredZone
的變量來跟蹤鼠標是否先前進入了區域,這樣即使鼠標在輸入后離開了區域,矩形也會保持不變(如果你想保留它,你可以選擇它)。 請注意,此代碼還有其他一些可能被認為是不好的做法,但這足以讓您入門:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class GameSetup extends JPanel implements MouseMotionListener {
public static JFrame njf = new JFrame("Test");
public static int x = 0, y = 0;
public static boolean enteredZone = false;
public static void main(String[] args) {
GameSetup gs = new GameSetup();
gs.addMouseMotionListener(gs);
njf.add(gs);
njf.setVisible(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.BLACK);
g.setColor(Color.GREEN);
g.fillRect(150, 75, 200, 100);
g.setColor(Color.ORANGE);
g.drawString("Play", 239, 123);
if (x > 100 && y > 100 || enteredZone){
g.drawRect(10, 10, 100, 100);
enteredZone = true;
}
}
public GameSetup() {
super();
setSize(500, 500);
njf.setSize(500,500);
njf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
njf.setResizable(false);
njf.setLocationRelativeTo(null);
}
@Override
public void mouseDragged(MouseEvent arg0) {
}
@Override
public void mouseMoved(MouseEvent e) {
x = e.getX();
y = e.getY();
if (x > 100 && y > 100) repaint();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.