3

これは私の最初の投稿であり、本当につまらないように思える質問がありますが、これは過去 1 時間ほど私を悩ませてきました。

JPanel を含む単純な JFrame を作成していますが、Windows 7 の境界フレームがパネルの一部のビューをブロックしているようです。たとえば、座標 0,0 に小さな四角形を描いても表示されず、窓枠の後ろにあると思われます。

pack、setsize、setpreferred size、setresizable、およびさまざまなレイアウトをいじってみましたが、上位 20 ピクセル程度を表示することはできません。

これは私が持っているものです:

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);
}

編集:

情報不足で申し訳ありませんが、すべての返信をありがとう:)

本で見たダブルバッファ戦略を使用しています。gameRender と paintScreen は、標準のゲーム ループにあります。私の RedSunGame クラスは JFrame を拡張します。上記に加えて、あなたが求めることができるすべての関連コード:

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);  }
}

私の現在の設定では、このように見えます。 http://i.imgur.com/qaabC.png

これは、g2d.fillRect(30, 30, 10, 10) がある場合に起こります。唯一の変更は、0,0 ではなく座標 30,30 です。それは間違いなく上の境界線の後ろに隠れています. http://i.imgur.com/uzfFe.png

また、BorderLayout.CENTER に設定しても、これらのケースのいずれにも違いはないようです。

(申し訳ありませんが、新しいユーザーは画像を投稿できません)

編集: 私はそれを理解しました。私はJFrameに直接描画していました。@Guillaume Polet実際にコンテンツを表示する必要があるパネルではなく、フレームに描画するため、JFramesのペイントメソッドをオーバーライドしてはならない理由がわかります!! ありがとう

4

3 に答える 3

3

これは、目標を達成する方法を示すサンプル コードです。コードの違いを見つけて、何が間違っているかを見つけてください。

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();
            }
        });
    }
}
于 2012-06-21T06:36:03.953 に答える
1

WIDTH と HEIGHT が > 0 であることを確認します。

これを試して:

//add(rs, "center");
add(rs, BorderLayout.CENTER);
于 2012-06-21T05:30:33.933 に答える
0

答えが得られたかもしれませんが、Java スイングの初心者には、Net-beans IDE を使用することをお勧めします。GUI をグラフィカルに追加およびレイアウトするため、手書きのコードを記述する必要はありません。ここに記載されているように、開始するのに最適な場所です。

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

于 2012-06-21T08:27:34.863 に答える