JPanels Мерцание во время перекрытия

Я пытаюсь сделать программу, которая случайным образом отображает JPanels в верхней части экрана. Эти JPanels содержат PNG BufferedImage смайлика (переопределяя PaintComponent). К сожалению, всякий раз, когда я запускаю программу, и панели рисуются в местах с любым перекрытием, изображения начинают мерцать (по-видимому, чтобы попытаться отобразить себя в то же время вместо компоновки). Я провел некоторое исследование и попытался решить проблему, но она не сработала. мой код ниже:

public class MainScreen extends JFrame{

public MainScreen ms;
private Smiley smileyPanel;
private int randomPosition;
public AlphaComposite ac;
private Graphics2D graphicsPane;


//main method
public static void main (String[] args){
    MainScreen ms = new MainScreen();
}

//this is my attempted fix to the program
protected void Paint (Graphics g){
    Graphics2D graphicsPane = (Graphics2D) g;
    ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER);
    graphicsPane.setComposite(ac);

    super.paint(g);
    }

//this creates the main frame and also starts creating smileys at the top
public MainScreen(){
    super("Main Screen Window");
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);

    this.setSize(500,800);
    this.getContentPane().setBackground(Color.black);
    this.setLayout(null);

    createSmiley(); createSmiley(); createSmiley(); createSmiley(); createSmiley(); createSmiley();

    this.setVisible(true);
}
//random number generator used to place an image at the top

public void setRandomPosition(){
    Random generator = new Random();
    randomPosition = generator.nextInt(473);
}

//this is the method to create an image at a random location at the top
public void createSmiley(){
    smileyPanel = new Smiley();
    this.add(smileyPanel);
    setRandomPosition();
    smileyPanel.setBounds(randomPosition, 0, 28, 29);
}
}

и мой другой класс:

public class Smiley extends JPanel{

private BufferedImage smileyFace;
private Dimension smileyPosition;
private File smileyFile;

public Smiley() {
    //this is the code to retrieve the smiley file
    try{
    smileyFile = new File("C:\\Users\\Devon\\Desktop\\smiley.png");
    smileyFace = ImageIO.read(smileyFile);
    } 
    catch (Exception e){
        System.out.println("There was an error finding or reading the file \" smiley.png.\"");
    }
}

//override of paintComponent method in order to display the grabbed image file onto a JPanel
@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(smileyFace, 0, 0, null);
    super.setBackground(null);
    super.setSize(28,29);
}
}

1 ответ

  1. Методы рисования только для рисования. Вы не должны устанавливать свойства компонента в методе рисования.

  2. Почему ты вообще занимаешься рисованием? Вы можете просто использовать JLabel с иконкой.

Другие вопросы по тегам