5

OS X で単純な JFrame ウィンドウを作成し、Graphics2d を使用してその上に単純な黒い四角形をレンダリングしようとしています。

public Start() { 
    running = true;
    window = new JFrame("Finest Hour");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setPreferredSize(new Dimension(500, 500));
    window.setSize(window.getPreferredSize());
    FullScreenUtilities.setWindowCanFullScreen(window, true);
    window.setIgnoreRepaint(true);
    window.setVisible(true);
    window.createBufferStrategy(2);
    strategy = window.getBufferStrategy();
}

public static void main(String[] args) {
    Start s = new Start();
    s.loop();
}

public void loop() {
    Random random = new Random();
    while(running) {
        Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
        g.setColor(Color.black);
        g.fillRect(20, 20, 40, 40);
        strategy.show();
    }
}

ただし、strategy.show(); を使用すると、ウィンドウの下部の角が丸くなっているようには見えません。:

strategy.show を使用

バッファ戦略なしでレンダリングします。つまり、Graphics2D = (Graphics2D) window.getGraphics(); 角の丸いウィンドウを生成します。

ここに画像の説明を入力

私はそれが本当に小さな問題であることを知っていますが、それにもかかわらず迷惑です. これを修正する方法はありますか?

4

1 に答える 1

4

私にとってはうまくいきます。

ここに画像の説明を入力

public class TestMacFrame extends JFrame {

    public TestMacFrame() throws HeadlessException {            
        super("Testing");
        setSize(200, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);            
        setLayout(new BorderLayout());
        add(new PaintPane());            
        setVisible(true);
    }

    protected class PaintPane extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {    
            super.paintComponent(g);                
            int width = getWidth() - 1;
            int height = getHeight() - 1;                
            g.setColor(Color.BLACK);                
            int blockWidth = width / 2;
            int blockHeight = height / 2;                
            int x = (width - blockWidth) / 2;
            int y = (height - blockHeight) / 2;                
            g.fillRect(x, y, blockWidth, blockHeight);                
        }            
    }

    public static void main(String[] args) {    
        new TestMacFrame();            
    }
}

さて、あなたが何をしようとしているのかはわかりませんが、次のことをお伝えできます。

public void loop() {
    Random random = new Random();
    while(running) {
        Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
        g.setColor(Color.black);
        g.fillRect(20, 20, 40, 40);
        strategy.show();
    }
}

悪い考えです。最初に SoboLAN が指摘したように、Event Dispatching Threadの外で UI コンポーネントを更新しようとしています。Swing コンポーネントはThread安全ではありません。

第 2 に、このループは最終的に CPU サイクルを食いつぶし、システム全体だけでなくアプリケーションも使用できなくなります。

アニメーションで更新

ほら、これやってみる。これは本当に基本的な例です ;)

public class TestMacFrame extends JFrame {

    private float angel = 0;
    private Timer timer;

    public TestMacFrame() throws HeadlessException {
        super("Testing");
        setSize(200, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        add(new PaintPane());
        setVisible(true);

        timer = new Timer(25, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                angel += 1;
                repaint();
            }
        });

        timer.setRepeats(true);
        timer.setCoalesce(true);
        timer.setInitialDelay(0);
        timer.start();
    }

    protected class PaintPane extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g.create();

            int width = getWidth() - 1;
            int height = getHeight() - 1;

            g.setColor(Color.BLACK);

            int blockWidth = width / 2;
            int blockHeight = height / 2;

            int x = (width - blockWidth) / 2;
            int y = (height - blockHeight) / 2;

            g2d.setTransform(AffineTransform.getRotateInstance(Math.toRadians(angel), width / 2, height / 2));
            g2d.fillRect(x, y, blockWidth, blockHeight);
            g2d.dispose();

        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new TestMacFrame();
    }
}
于 2012-08-21T20:14:12.973 に答える