3

Canvas を含む jFrame があります。Windows XP/Vista でプログラムを実行し、ウィンドウのサイズを変更すると、ウィンドウに比例してキャンバスのサイズが変更されます。

ただし、Ubuntu Linux では、同じ Java アプリケーションをコンパイルしてウィンドウのサイズを変更すると、キャンバスは同じサイズのままです。

Windows と Linux の両方でキャンバスのサイズをウィンドウに合わせて変更するにはどうすればよいですか? 不一致との取引は何ですか?

Main.java

public class Main {
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("BallBounce");
        frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(),BoxLayout.Y_AXIS));

        BallCanvas ballCanvas = new BallCanvas();

        frame.getContentPane().add(ballCanvas);
        frame.getContentPane().add(controlPanel);
        frame.pack();
        frame.setVisible(true);
    }
}

BallCanvas.java

public class BallCavnas extends Canvas {
    public BallCanvas()
    {
        setPreferredSize(new Dimension(640, 400));
        setIgnoreRepaint(true);

        ... various gui controls are wired up here
    }
    ... rest of canvas code
}

編集:誰かが見たい場合に備えて、私のソースコードはここに圧縮されています:
http://www.filedropper.com/ballbounce

Dave Ray による提案を実行しましたが、それでもキャンバスのサイズが変更されませんか? このJavaプログラムをコンパイルしてWindowsで実行すると、うまくサイズが変更されることを覚えておいてください。Linuxでのみこれを行います。問題があれば、Java 6 Sun 1.6.0.10 JVM も実行しています。

代替テキスト http://img158.imageshack.us/img158/7642/screenshotww0.png

おそらく、BufferStrategy/Graphicsによってキャンバスのサイズが変更されていますが、サイズが変更されていませんか?

編集 2: スクリーンショットから、間違いなく CENTER に設定されています。

frame.getContentPane().add(ballCanvas, BorderLayout.CENTER);
frame.getContentPane().add(controlPanel, BorderLayout.SOUTH);

解決済み

どうやら「キャンバス」のサイズが変更されていたようですが、IT のサイズ変更を許可していないバッファ戦略で奇妙なことをしていました。それを私が直した。みんな、ありがとう!

4

4 に答える 4

3

おそらく、レイアウト マネージャーは、好みのサイズを優先しようとしているだけです。

私は...するだろう:

A)何が起こるかを確認するためだけに優先を削除します(とにかくあまり良い考えではありません)

また

B) そもそもキャンバスを使用せず、JComponent を使用する。結局のところ、Canvas は AWT コンポーネントであり、とにかく現在のようにどのように機能するかはよくわかりません。JComponent は軽量のコンポーネントであり、JComponent をコンテナとして使用しているため、それらは ... うーん、一緒に使うとうまくいきますか?

ええと..私は今、ブードゥー教のプログラミングの提案をしています。仕事に取り掛かるほうがいい。

C)私にとって常にうまくいったこと。私のコードに段階的に追加することで、概念の小さな証明を作成します。空のキャンバスから始めて、好みのサイズを追加してから、などなど。バグはペイントメソッドにある可能性があります:P

幸運を。

:)

于 2009-01-22T05:47:16.030 に答える
2

代わりにボーダー レイアウトを使用します。

frame.getContentPane().setLayout(new BorderLayout());
BallCanvas ballCanvas = new BallCanvas();
frame.getContentPane().add(ballCanvas, BorderLayout.CENTER);            
frame.getContentPane().add(controlPanel, BorderLayout.SOUTH);

また、frame.setSize() を優先して setPreferredSize() を取り除き、ディスプレイの初期サイズを設定します。

于 2009-01-22T04:48:14.373 に答える
2

別の良い解決策は、キャンバスを JPanel に入れることです。

    panel.add(new JPanel() {

        @Override
        public void paint(Graphics g) {
          // do not paint
        }

    }.add(capture));

キャンバス関数では、次のようなものです

@Override
public void paint(Graphics g) {
    Dimension currentSize = getParent().getSize();
    int width = currentSize.width;
    int height = currentSize.height;
    if (offscreenImage == null || !currentSize.equals(offscreenDimension)) {
        // call the 'java.awt.Component.createImage(...)' method to get an
        // image
        offscreenImage = createImage(width, height);
        offscreenGraphics = offscreenImage.getGraphics();
        offscreenDimension = currentSize;
    }

    if (image != null) {
        offscreenGraphics.drawImage(image, 0, 0, width, height, null);
    } else {
        offscreenGraphics.setColor(Color.BLACK);
        offscreenGraphics.fillRect(0, 0, width, height);
    }
    //scratch image
    g.drawImage(offscreenImage, 0, 0, this);
}

例えば。これにより、非常に簡単になります。ニーズに合わせて親パネルを取得します。

于 2011-12-29T00:29:17.633 に答える
1

デイブのアドバイスに従った場合、特に。ballCanvas を CENTER に配置すると、ballCanvas の最大サイズを設定する必要があります。

于 2009-01-22T05:38:57.967 に答える