簡體   English   中英

如何在Java中將鼠標懸停偵聽器添加到矩形

[英]How to add a mouse hover listener to a rectangle in Java

我正在嘗試使用Rectangle對象創建按鈕,還試圖在懸停時改變顏色,並且顏色不會改變。 我已經使代碼中的變量具有更通用的名稱,以至於不會混淆,這里是:

public class MouseHandler extends MouseAdapter {
    @Override
    public void mouseMoved(MouseEvent e) {
        int mx = e.getX();
        int my = e.getY();
        if(mx > button.x && mx < button.x+button.width &&
                my > button.y && my < button.y+button.height) {
                buttonHover = true;
        } else {
                buttonHover = false;

        }
    }
}

而且我也嘗試調用這些代碼行,但這行不通:

if(buttonHover)
g.setColor(hoverColor);
g.drawRect(button.x, button.y, button.width, button.height);

我將把完整的代碼和實際的變量名放在底部。 謝謝您的幫助!

package trivia;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Main extends JFrame{

boolean mainMenu = true;
boolean startHover;
static Color tan = Color.decode("#F4EBC3");
static Color darkGreen = Color.decode("#668284");
static Color buttonColor = Color.decode("#A2896B");
static Color borderColor = Color.decode("#333333");
static Color buttonHover = Color.decode("#F5B66E");
Rectangle header = new Rectangle(0, 0, 500, 100);
Rectangle body = new Rectangle(0, 100, 500, 400);
Rectangle start = new Rectangle(150, 150, 200, 40);
Rectangle howToPlay = new Rectangle(150, 225, 200, 40);
Rectangle quit = new Rectangle(150, 300, 200, 40);

public Main() {
    setTitle("Trivia Game!");
    setSize(500, 500);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);

}
@Override
public void paint(Graphics g) {
    Dimension d = this.getSize();
    if(mainMenu = true){
        g.setColor(darkGreen);
        g.fillRect(header.x, header.y, header.width, header.height);
        g.setFont(new Font("Courier", Font.BOLD, 24));
        g.setColor(Color.BLACK);
        drawCenteredString("Trivia Game!", d.width, 125, g);
        g.setColor(tan);
        g.fillRect(body.x, body.y, body.width, body.height);
        g.setColor(buttonColor);
        g.fillRect(start.x, start.y, start.width, start.height);
        g.setColor(borderColor);
        g.drawRect(start.x, start.y, start.width, start.height);
        g.setFont(new Font("Courier", Font.BOLD, 20));
        g.setColor(Color.black);
        drawCenteredString("Start", d.width, 340, g);
        g.setColor(buttonColor);
        g.fillRect(howToPlay.x, howToPlay.y, howToPlay.width, howToPlay.height);
        g.setColor(borderColor);
        g.drawRect(howToPlay.x, howToPlay.y, howToPlay.width, howToPlay.height);
        g.setFont(new Font("Courier", Font.BOLD, 20));
        g.setColor(Color.black);
        drawCenteredString("How To Play", d.width, 490, g);
        g.setColor(buttonColor);
        g.fillRect(quit.x, quit.y, quit.width, quit.height);
        g.setColor(borderColor);
        g.drawRect(quit.x, quit.y, quit.width, quit.height);
        g.setFont(new Font("Courier", Font.BOLD, 20));
        g.setColor(Color.black);
        drawCenteredString("Quit?", d.width, 640, g);
        g.setColor(buttonColor);
        g.fillRect(start.x, start.y, start.width, start.height);
        g.setColor(borderColor);
        g.drawRect(start.x, start.y, start.width, start.height);
        g.setFont(new Font("Courier", Font.BOLD, 20));
        g.setColor(Color.black);
        drawCenteredString("Start", d.width, 340, g);
        if(startHover)
            g.setColor(buttonHover);
            g.drawRect(start.x, start.y, start.width, start.height);
    }
}
public void drawCenteredString(String s, int w, int h, Graphics g) {
    FontMetrics fm = g.getFontMetrics();
    int x = (w - fm.stringWidth(s)) / 2;
    int y = (fm.getAscent() + (h- (fm.getAscent() + fm.getDescent())) / 2);
    g.drawString(s, x, y);
}

public static void main(String[] args) {
    @SuppressWarnings("unused")
    Main m = new Main();
}
public class MouseHandler extends MouseAdapter {
    @Override
    public void mouseMoved(MouseEvent e) {
        int mx = e.getX();
        int my = e.getY();
        if(mx > start.x && mx < start.x+start.width &&
                my > start.y && my < start.y+start.height) {
                startHover = true;
                System.out.println("yes");
        } else {
                startHover = false;
                System.out.println("no");
        }
    }
}
}

我將從...開始

1)如果確實是您要處理的矩形。 請使用https://docs.oracle.com/javase/7/docs/api/java/awt/Rectangle.html,Java足以使您的生活變得簡單,請不要扔掉它。 (忽略此內容以供參考)

2)您應該實現MouseMotionListener ...我為您做了。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class test extends JFrame  implements MouseMotionListener {

boolean mainMenu = true;
boolean startHover;
static Color tan = Color.decode("#F4EBC3");
static Color darkGreen = Color.decode("#668284");
static Color buttonColor = Color.decode("#A2896B");
static Color borderColor = Color.decode("#333333");
static Color buttonHover = Color.decode("#F5B66E");
Rectangle header = new Rectangle(0, 0, 500, 100);
Rectangle body = new Rectangle(0, 100, 500, 400);
Rectangle start = new Rectangle(150, 150, 200, 40);
Rectangle howToPlay = new Rectangle(150, 225, 200, 40);
Rectangle quit = new Rectangle(150, 300, 200, 40);

public test() {
    setTitle("Trivia Game!");
    setSize(500, 500);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    this.addMouseMotionListener(this);
}

@Override
public void paint(Graphics g) {
    Dimension d = this.getSize();
    if (mainMenu = true) {
        g.setColor(darkGreen);
        g.fillRect(header.x, header.y, header.width, header.height);
        g.setFont(new Font("Courier", Font.BOLD, 24));
        g.setColor(Color.BLACK);
        drawCenteredString("Trivia Game!", d.width, 125, g);
        g.setColor(tan);
        g.fillRect(body.x, body.y, body.width, body.height);
        g.setColor(buttonColor);
        g.fillRect(start.x, start.y, start.width, start.height);
        g.setColor(borderColor);
        g.drawRect(start.x, start.y, start.width, start.height);
        g.setFont(new Font("Courier", Font.BOLD, 20));
        g.setColor(Color.black);
        drawCenteredString("Start", d.width, 340, g);
        g.setColor(buttonColor);
        g.fillRect(howToPlay.x, howToPlay.y, howToPlay.width,
                howToPlay.height);
        g.setColor(borderColor);
        g.drawRect(howToPlay.x, howToPlay.y, howToPlay.width,
                howToPlay.height);
        g.setFont(new Font("Courier", Font.BOLD, 20));
        g.setColor(Color.black);
        drawCenteredString("How To Play", d.width, 490, g);
        g.setColor(buttonColor);
        g.fillRect(quit.x, quit.y, quit.width, quit.height);
        g.setColor(borderColor);
        g.drawRect(quit.x, quit.y, quit.width, quit.height);
        g.setFont(new Font("Courier", Font.BOLD, 20));
        g.setColor(Color.black);
        drawCenteredString("Quit?", d.width, 640, g);
        g.setColor(buttonColor);
        g.fillRect(start.x, start.y, start.width, start.height);
        g.setColor(borderColor);
        g.drawRect(start.x, start.y, start.width, start.height);
        g.setFont(new Font("Courier", Font.BOLD, 20));
        g.setColor(Color.black);
        drawCenteredString("Start", d.width, 340, g);
        if (startHover)
            g.setColor(buttonHover);
        g.drawRect(start.x, start.y, start.width, start.height);
    }
}

public void drawCenteredString(String s, int w, int h, Graphics g) {
    FontMetrics fm = g.getFontMetrics();
    int x = (w - fm.stringWidth(s)) / 2;
    int y = (fm.getAscent() + (h - (fm.getAscent() + fm.getDescent())) / 2);
    g.drawString(s, x, y);
}

public static void main(String[] args) {
    @SuppressWarnings("unused")
    test m = new test();
}

@Override
public void mouseDragged(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseMoved(MouseEvent e) {
    System.out.println("lol");
    int mx = e.getX();
    int my = e.getY();
    if (mx > start.x && mx < start.x + start.width && my > start.y
            && my < start.y + start.height) {
        startHover = true;
        System.out.println("yes");
    } else {
        startHover = false;
        System.out.println("no");
    }
}
}

如果您閱讀下面的內容,可以看到您的代碼有很多錯誤。 不要讓那嚇到你學習。 一步一步做就可以了。

您在這里遇到了幾個問題:

  • 您正在直接在JFrame中繪制圖形,這很危險,因為JFrame包含許多組件,所以我確定您不熟悉其中的幾個組件,包括邊框,根窗格,玻璃窗格和內容窗格,如果您搞砸了,繪畫,可能會弄亂這些關鍵組件的繪制。
  • 同樣,通過在繪制方法內部進行繪制,您將失去Swing圖形的所有優點。
  • 同樣,您似乎在繪畫方法中擁有大部分程序設計和邏輯,這是您永遠都不應做的事情,因為您無法完全控制何時甚至調用該方法。
  • 相反,您應該在與JFrame分開的類中創建按鈕組件
  • 使您的班級能夠放置在JPanel中
  • 並為其提供翻轉功能。
  • 為了我的錢,我只是擴展一個JButton或更好,只使用一個JButton,並使它看起來像我想要的方式,而不是嘗試重新發明輪子。

例如,

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

@SuppressWarnings("serial")
public class Main2 extends JPanel {
   private static final Color TAN = Color.decode("#F4EBC3");
   private static final Color DARK_GREEN = Color.decode("#668284");
   private static final Color BUTTON_COLOR = Color.decode("#A2896B");
   private static final Color BORDER_COLOR = Color.decode("#333333");
   private static final Color BUTTON_ROLLOVER_COLOR = Color.decode("#F5B66E");
   private static final String TITLE = "Trivia Game!";
   private static final Font TITLE_FONT = new Font("Courier", Font.BOLD, 24);
   private static final int PREF_W = 500;
   private static final int PREF_H = PREF_W - 30;
   private JButton startButton;
   private JButton howToPlayButton;
   private JButton quitButton;


   public Main2() {
      JLabel titleLabel = new JLabel(TITLE, SwingConstants.CENTER);
      titleLabel.setFont(TITLE_FONT);
      int blGap = 15;
      titleLabel.setBorder(BorderFactory.createEmptyBorder(blGap, blGap, blGap, blGap));
      JPanel titlePanel = new JPanel(new GridBagLayout());
      titlePanel.setBackground(DARK_GREEN);
      titlePanel.add(titleLabel);

      JPanel centerInnerPanel = new JPanel(new GridLayout(0, 1, blGap, 2 * blGap));
      centerInnerPanel.setOpaque(false);
      centerInnerPanel.setBorder(BorderFactory.createEmptyBorder(blGap, blGap, blGap, blGap));
      centerInnerPanel.add(startButton = createButton("Start"));
      centerInnerPanel.add(howToPlayButton = createButton("How To Play"));
      centerInnerPanel.add(quitButton = createButton("Quit?"));

      JPanel centerOuterPanel = new JPanel(new GridBagLayout());
      centerOuterPanel.setBackground(TAN);
      centerOuterPanel.add(centerInnerPanel);


      setLayout(new BorderLayout());
      add(titlePanel, BorderLayout.PAGE_START);
      add(centerOuterPanel, BorderLayout.CENTER);
   }

   private JButton createButton(String name) {
      final JButton button = new JButton(name);
      button.setFont(TITLE_FONT.deriveFont(20F));
      button.setBackground(BUTTON_COLOR);
      Border emptyBorder = BorderFactory.createEmptyBorder(5, 25, 5, 25);
      Border lineBorder = BorderFactory.createLineBorder(BORDER_COLOR);
      Border nestedBorder = BorderFactory.createCompoundBorder(lineBorder, emptyBorder);
      button.setBorder(nestedBorder);


      button.getModel().addChangeListener(new ChangeListener() {

         @Override
         public void stateChanged(ChangeEvent e) {
            ButtonModel model = (ButtonModel)e.getSource();
            if (model.isRollover()) {
               button.setBackground(BUTTON_ROLLOVER_COLOR);
            } else {
               button.setBackground(BUTTON_COLOR);
            }
         }
      });

      return button;
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      int w = Math.max(super.getPreferredSize().width, PREF_W);
      int h = Math.max(super.getPreferredSize().height, PREF_H);

      return new Dimension(w, h);
   }

   private static void createAndShowGui() {
      Main2 mainPanel = new Main2();

      JFrame frame = new JFrame("Main2");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM