2016-07-01 9 views
1

私はこのシンプルなペイントライクなプログラムを作ろうとしています。今までこれまで成功していましたが、この問題が1つあります。私は、アプリケーションを実行すると、背景は透明です、それはすべてがうまく動作していることを除いて、画面をレンダリングします。また、私がsuper.paint()を使用する場合、画面が点滅してちらつきが始まり、それは良くないわけではありません。私は現在、チュートリアルに続いてEclipseを使用しています。その人はすべてうまく動作しているようです。私は完全な初心者でもありますので、今のところ3日間Javaを学んでいるだけなので、すべて私に感謝してください。透明な背景がありますか?

package JavaMain; 

import java.awt.Graphics; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import javax.swing.JFrame; 

public class javamain extends JFrame { 

    int x, y; 

    private static final long serialVersionUID = 1L; 

    private class AL extends KeyAdapter { 

    private int keycode; 

    @SuppressWarnings("static-access") 
    public void keyPressed(KeyEvent event) { 

     keycode = event.getKeyCode(); 

     if (keycode == event.VK_LEFT) { 
     x--; 
     } 

     if (keycode == event.VK_RIGHT) { 
     x++; 
     } 
     if (keycode == event.VK_UP) { 
     y--; 
     } 
     if (keycode == event.VK_DOWN) { 
     y++; 
     } 
    } 

    public void keyReleased(KeyEvent e) {} 
    } 

    public javamain() { 
    addKeyListener(new AL()); 
    setTitle("Statistic"); 
    setSize(600, 800); 
    setResizable(false); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    x = 200; 
    y = 200; 
    } 

    public void paint(Graphics g) { 

    g.fillRect(x, y, 2, 2); 

    repaint(); 
    } 

    public static void main(String[] args) { 

    new javamain(); 
    } 
} 

答えて

0

まず...

あなたは、塗料のチェーンを壊している...

public void paint (Graphics g) 

{ 

// You MUST call super.paint here... 

g.drawString("Hello World!", 250, 250); 

} 

セカンド

あなたは、塗料を上書きし、すべてのコストで、避けなければなりませんJFrameのようなトップレベルコンテナのそのうちの1つが見つかっただけでなく、トップレベルのコンテナがダブルバッファされていないため、JFrameには他のコンポーネント、JRootPane、コンテンツペイン、ガラスペインが含まれているときにちらつきが発生します。あなたがペイントしようとしているものの上にペイントすることができます。

また、フレームに直接塗装しています...

(それが悪い理由の)例えば

...あなたは何をしたいのか、実際にはないフレームの装飾、下ペイントすることができます

サイズを変更しても画面の真ん中を取得する方法 中にどのように設定できますか? Java AWT drawString()はウィンドウに表示されません 解決策...

JPanelのようなものから拡張したカスタムクラスを作成し、paintComponentメソッドをオーバーライドしてカスタムペイントを実行します。コンテンツペインがフレーム装飾内で維持されることを保証するので、自由にダブルバッファリングをサポートし、フレームの境界線を気にする必要はありません。

は、フレームのサイズを設定する前にsetResizableを呼び出す、これはフレームの装飾のサイズを変更し、フレームの中に予想外の追加の間隔を生成することができAWTで絵画を参照し、スイングや詳細も

のカスタムペイントを実行しますコンテンツエリア...

第三....

その後、最終的には私は本当にあなたが

を求めているかについて、いくつかのより良いアイデアを得るためにあなたを助けますコードを共有します0
public class Main extends JPanel implements KeyListener 

    { 

    private Point startPoint = new Point(0, 0); 

    private Point endPoint = new Point(0, 0); 

    public Main() 

    { 
    addKeyListener(this); 

    } 

    public void keyPressed(KeyEvent evt) 

    { 

    int keyCode = evt.getKeyCode(); 
    int d; 

    if (evt.isShiftDown()) 
     d = 5; 
    else 
     d = 1; 

    if (keyCode == KeyEvent.VK_LEFT) 
     add(-d, 0); 
    else if (keyCode == KeyEvent.VK_RIGHT) 
     add(d, 0); 
    else if (keyCode == KeyEvent.VK_UP) 
     add(0, -d); 
    else if (keyCode == KeyEvent.VK_DOWN) 
     add(0, d); 
    } 

    public void keyReleased(KeyEvent evt) 
    { 
    } 

    public void keyTyped(KeyEvent evt) 
    { 

    } 

    public boolean isFocusTraversable() 

    { 

    return true; 

    } 

    public void add(int dx, int dy) 

    { 

    endPoint.x += dx; 
    endPoint.y += dy; 
    Graphics g = getGraphics(); 
    g.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y); 
    g.dispose(); 
    startPoint.x = endPoint.x; 
    startPoint.y = endPoint.y; 

    } 



public static void main(String[] args) 

    { 

    JFrame frame = new JFrame(); 
    frame.setTitle("Sketch"); 
    frame.setSize(300, 200); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Container contentPane = frame.getContentPane(); 
    contentPane.add(new Main()); 

    frame.setVisible(true); 

    } 

} 
+0

既に修正済みですので、とにかくお返事ありがとうございます! –