Fraser Angus
Fraser Angus

Reputation: 37

Weird Swing Glitch?

I don't understand this, I'm currently making a main menu for a game i'm making but for some reason when I hover over a JButton, it flashes up on the top left side of the JFrame. I don't have any mouseAction methods or anything, is it the gif i'm using? I'm not sure...

Here is a screengrab of the error

https://i.sstatic.net/BTUmP.png

Here is my code :

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

public class MainMenu {
JFrame frame = new JFrame("Frasergatchi");

public void display(){
    frame.setSize(400,400);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setVisible(true);
}

public void addComponents(){
    JButton play = new JButton("Play");
    JButton instructions = new JButton("Instructions");
    JButton exit = new JButton("Exit");
    JPanel panel = new JPanel();
    paintMenu paintMenu = new paintMenu();

    panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));

    frame.add(panel);

    play.setAlignmentX(Component.CENTER_ALIGNMENT);
    instructions.setAlignmentX(Component.CENTER_ALIGNMENT);
    exit.setAlignmentX(Component.CENTER_ALIGNMENT);

    panel.add(paintMenu);
    panel.add(play);
    panel.add(instructions);
    panel.add(exit);
}

public class paintMenu extends JPanel{
    public void paintComponent(Graphics graphics){
        Image dog = new ImageIcon(getClass().getResource("DogMenuImage.gif")).getImage();
        graphics.drawImage(dog,170,240,this);
    }
}
}

Upvotes: 3

Views: 285

Answers (1)

camickr
camickr

Reputation: 324118

The first statement in the paintComponent() method should always be:

super.paintComponent(g); 

to make sure the background gets cleared.

Also:

  1. Don't do I/O in a painting method. Painting methods are for painting only. Read the image in the constructor of your class and same the image in an instance variable.

  2. Class names SHOULD start with an upper case character. Think of all the classes in the JDK and follow the standards.

  3. There is no need to create a custom class to paint the image. Just use a JLabel with an Icon.

Upvotes: 5

Related Questions