3 votes

Cadre de fenêtre couvrant le contenu graphique

C'est mon premier message ici et j'ai une question qui semble vraiment nooby, mais cela me préoccupe depuis une heure environ.

Je crée un simple JFrame contenant un panneau JPanel, mais le cadre de bordure de Windows 7 semble bloquer la vue de certaines parties du panneau. Par exemple, si je dessine un petit carré aux coordonnées 0,0, il n'apparaît pas et je soupçonne qu'il se trouve derrière le cadre de la fenêtre.

J'ai essayé d'utiliser pack, setsize, setpreferred size, setresizable et différentes mises en page, mais je n'arrive pas à afficher les 20 premiers pixels environ !

C'est ce que j'ai :

public RedSunGame() {
super("Red Sun");

rs = new JPanel(new BorderLayout(), true);
rs.setPreferredSize(new Dimension(WIDTH, HEIGHT));
add(rs, "Center");

setPreferredSize(new Dimension(WIDTH, HEIGHT));
pack();
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}

EDIT :

Merci pour toutes vos réponses, désolé pour le manque d'informations :)

J'utilise une stratégie de double tampon que j'ai vue dans un livre. gameRender et paintScreen sont dans une boucle de jeu standard. Ma classe RedSunGame étend JFrame. Tout le code pertinent que vous pourriez demander en plus de ce qui précède :

private static final int WIDTH = 500;
private static final int HEIGHT = 500;
private JPanel rs;
private Graphics2D g2d;
private Image dbImage;

private void gameRender() {
//create buffer
if (dbImage == null){
  dbImage = createImage(WIDTH, HEIGHT);
  g2d = (Graphics2D)dbImage.getGraphics();
}
//clear screen
g2d.setColor(Color.white);
g2d.fillRect(0, 0, WIDTH, HEIGHT);

g2d.setColor(Color.blue);
g2d.setFont(font);
g2d.drawString("FPS: " + FPS, 0, HEIGHT);
g2d.fillRect(30, 30, 10, 10);
}

private void paintScreen() {
Graphics g;
try {
  g = getGraphics();
  if ((g != null) && (dbImage != null))
    g.drawImage(dbImage, 0, 0, null);
  Toolkit.getDefaultToolkit().sync();
  g.dispose();
}
catch (Exception e)
{ System.out.println("Graphics context error: " + e);  }
}

Avec mes paramètres actuels, cela ressemble à ceci. http://i.imgur.com/qaabC.png

Voici ce qui se passe si j'utilise g2d.fillRect(30, 30, 10, 10), le seul changement étant les coordonnées 30,30 au lieu de 0,0. Il se cache définitivement derrière la bordure du haut. http://i.imgur.com/uzfFe.png

De même, le fait de lui attribuer la valeur BorderLayout.CENTER ne semble pas faire de différence dans tous ces cas.

(désolé, il ne permet pas aux nouveaux utilisateurs de poster des images)

EDIT : J'ai compris. Je dessinais directement dans le JFrame. @Guillaume Polet Je vois pourquoi il ne faut pas surcharger la méthode paint de JFrames car elle dessine sur le cadre et non sur le panneau qui doit afficher le contenu !!! Merci

3voto

Guillaume Polet Points 31933

Voici un exemple de code qui montre comment votre objectif peut être atteint. Essayez de repérer les différences avec votre code pour trouver ce qui ne va pas :

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class RedSunGame {

    private static final int SQUARE_SIZE = 20;
    private JPanel rs;
    private JFrame frame;

    private void initUI() {
        frame = new JFrame("Red Sun");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        rs = new JPanel(new BorderLayout()) {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.YELLOW);
                g.fillRect(0, 0, SQUARE_SIZE, SQUARE_SIZE);
            }

            @Override
            public Dimension getPreferredSize() {
                Dimension preferredSize = super.getPreferredSize();
                // Let's make sure that we have at least our little square size.
                preferredSize.width = Math.max(preferredSize.width, SQUARE_SIZE);
                preferredSize.height = Math.max(preferredSize.height, SQUARE_SIZE);
                return preferredSize;
            }
        };
        frame.add(rs);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                RedSunGame redSunGame = new RedSunGame();
                redSunGame.initUI();
            }
        });
    }
}

1voto

Julián Chamalé Points 597

Vérifiez que WIDTH et HEIGHT sont > 0.

Essayez ça :

//add(rs, "center");
add(rs, BorderLayout.CENTER);

0voto

vedant1811 Points 658

Vous avez peut-être obtenu votre réponse mais pour un débutant en Java Swing, je vous suggère d'utiliser l'IDE Net-beans. Il ajoute et présente graphiquement l'interface graphique et vous n'avez pas besoin d'écrire de code à la main. C'est un excellent endroit pour commencer, comme indiqué ici :

http://docs.oracle.com/javase/tutorial/uiswing/learn/index.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X