Нежелательные изображения, появляющиеся на кнопке Java

#image #button #graphics #hover

Вопрос:

Я пытаюсь использовать кнопку в форме многоугольника в Java. Я нашел этот код для этой цели:

 package testklassen;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PolygonButton extends JButton {

    private Polygon shape;

    public PolygonButton(int[] x, int[] y) {
        this.shape = new Polygon();
        
        this.initialize(x, y);
    }

    protected void initialize(int[] x, int[] y) {
        Point p1, p2, p3, p4, p5;

        this.setSize(90, 120);

        p1 = new Point(x[0], y[0]);
        p2 = new Point(x[1], y[1]);
        p3 = new Point(x[2], y[2]);
        p4 = new Point(x[3], y[3]);
        p5 = new Point(x[4], y[4]);

        this.shape.addPoint((int) Math.round(p1.getX()),
                (int) Math.round(p1.getY()));
        this.shape.addPoint((int) Math.round(p2.getX()),
                (int) Math.round(p2.getY()));
        this.shape.addPoint((int) Math.round(p3.getX()),
                (int) Math.round(p3.getY()));
        this.shape.addPoint((int) Math.round(p4.getX()),
                (int) Math.round(p4.getY()));
        this.shape.addPoint((int) Math.round(p5.getX()),
                (int) Math.round(p5.getY()));

        this.setMinimumSize(this.getSize());
        this.setMaximumSize(this.getSize());
        this.setPreferredSize(this.getSize());
    }

    // Hit detection
    public boolean contains(int x, int y) {
        return this.shape.contains(x, y);
    }

    // Draw Button
    protected void paintComponent(Graphics g) {
        Graphics2D gCopy = (Graphics2D) g.create();
        gCopy.fillPolygon(this.shape);

    }

}
 

Чтобы проверить это, я создаю простую рамку, содержащую кнопку Polygon и обычную кнопку:

 package testklassen;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FrameForPolygonButton extends JFrame {
  
    
    int[] x = {0, 50, 100, 100, 0};
    int[] y = {0, 50, 0, 100, 100};
  PolygonButton polygonButton = new PolygonButton(x, y);
  JButton button = new JButton();
  
  public FrameForPolygonButton() { 
    
    super();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 530; 
    int frameHeight = 400;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);

    
    setVisible(true);

    button.setBounds(200, 200, 50, 50);
    cp.add(button);
    
    //polygonButton.setBorder(null);
    
    cp.add(polygonButton);
    
  } 
  
  public static void main(String[] args) {
    new FrameForPolygonButton();    
  }
} 
 

Вот как это выглядит, когда начинаешь. И это именно то, чего я хочу.

Но когда я наведу курсор на другую кнопку J, а затем снова наведу курсор на кнопку Polygon

изображение кнопки J появится на кнопке Polygon

Кто-нибудь знает, как я могу этого избежать?

Ответ №1:

Я нашел решение этой проблемы. Но я все еще не знаю, почему это вообще происходило. Если кто-то знает, мне было бы интересно.

Решение, которое сработало для меня, состояло в том, чтобы добавить эту строку:

 polygonButton.setOpaque(false);