2017-01-12 1 views
0

これはFrameを作成し、Graphicsを実装するクラスを保持するMainApplicationです。キーリストが動作していますが、意図した操作が実行されていません。どうして?

MainApplication.java

import java.awt.*; 

public class MainApplication 
{ 
    public MainApplication() 
    { 
     Frame frame= new Frame("Test App"); 
     frame.add(new KeyTest()); 
     frame.setBackground(Color.RED); 
     frame.setLayout(null); 
     frame.setSize(700,750); 
     frame.setVisible(true); 
    } 
    public static void main(String args[]) 
    { 

     new MainApplication(); 

    } 
} 

このクラスは、すべてのグラフィカルな図形を作成し、あまりにものKeyListenerを実装しています。

KeyTest.java

import java.awt.BasicStroke; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.Shape; 
import java.awt.Stroke; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.geom.RoundRectangle2D; 

public class KeyTest extends Canvas { 


    /** 
    * 
    */ 
    private static final long serialVersionUID = 3L; 
    Graphics2D graphics2D; 
    Color color = Color.BLACK; 
    private static float borderThickness = 5; 
    Shape firstShape = new RoundRectangle2D.Double(20,40,300,50,10,10); 
    Shape secondShape = new RoundRectangle2D.Double(20,150,300,50,10,10); 
    public KeyTest() 
    { 
     setBackground(Color.RED); 
     setSize(700,750);    
    } 
    public void paint(Graphics graphics) 
    { 

     graphics2D = (Graphics2D)graphics; //TypeCasting to 2D 
     System.out.println("I am inside paint"); 

     //  Smoothening the corners 
     graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 

     //  Apple border color 
     Stroke oldStroke = graphics2D.getStroke(); 
     graphics2D.setStroke(new BasicStroke(borderThickness)); 
     graphics2D.setColor(Color.WHITE); 

     //  Drawing a RoundedRectangle for Apple  
     graphics2D.draw(firstShape); 
     graphics2D.setStroke(oldStroke); 

     //  Setting the Background Color 
     graphics2D.setColor(Color.BLACK); 
     graphics2D.fill(firstShape); 


     //  Setting the font inside the shape 
     Font firstFont = new Font("Serif", Font.BOLD,35); 
     graphics2D.setFont(firstFont); 
     graphics2D.setColor(Color.WHITE); 
     graphics2D.drawString("Apple",30,80); 


     //  Pineapple border color 
     graphics2D.setStroke(new BasicStroke(borderThickness)); 
     graphics2D.setColor(Color.WHITE); 

     //  Drawing a RoundedRectangle for Pineapple  
     graphics2D.draw(secondShape); 
     graphics2D.setStroke(oldStroke); 

     //  Setting the Background Color 
     graphics2D.setColor(Color.BLACK); 
     graphics2D.fill(secondShape); 

     //  Setting the font inside the shape 
     Font secondFont = new Font("Serif", Font.BOLD,35); 
     graphics2D.setFont(secondFont); 
     graphics2D.setColor(Color.WHITE); 
     graphics2D.drawString("Pineapple",30,190); 

     addKeyListener(new KeyListener(){ 

      @Override 
      public void keyTyped(KeyEvent e) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void keyPressed(KeyEvent e) { 
       int keyCode = e.getKeyCode(); 

       System.out.println(keyCode); 
       System.out.println(KeyEvent.VK_UP); 
       if(keyCode==KeyEvent.VK_UP){ 
        System.out.println("Going to move up"); 
        move(firstShape); 

       } 
       if(keyCode==KeyEvent.VK_DOWN){ 
        System.out.println("Going to move down"); 
        move(secondShape); 

       } 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       // TODO Auto-generated method stub 

      }}); 
    } 
    public void move(Shape s){ 

     System.out.println("Check:"+s.getBounds2D()); 
     graphics2D.setColor(Color.GREEN); 
     graphics2D.fill(s); 
     System.out.println("moving out"); 
    } 
} 

は私のコンソール出力は明らかに私の主なリスナーが動作することを示しているが、その私はそれをするつもりタスクを実行していません。

コンソール出力

私は

チェック上に移動するために行く塗料の内側に午前:=ワットjava.awt.geom.Rectangle2D $ダブル[X = 20.0、Y = 40.0を、 300.0、H = 50.0]

チェックダウン移動しよう転出:300 = W java.awt.geom.Rectangle2D $ダブル[X = 20.0、Y = 150.0を、。

The Output which am getting now

The output I expect when I press DOWN ARROW Button

The Output I expect when I press UP ARROW Button

:0、H = 50.0]

出力OUT移動します今取得しています

出力...(画像1)

私は矢印ボタンを押しすると予想される出力(画像2)

私は上矢印ボタンを押すと、期待出力(画像3)

+0

恐らく、あなたのフレームに何らかの再描画/リフレッシュを引き起こす必要があります。そしてヒント:あなたの質問にすべての**画像を含めることは絶対にありません。 – GhostCat

+0

'paint'メソッドの中に' KeyListener'を追加しても、うまく見えません。外にそれを追加 – Berger

+0

は、私はこの答えは、あなたがpaintメソッドとのKeyListenerと格闘するときに発生するすべての問題を解決します 'paint'方法 –

答えて

2

最初にpaintが呼び出されるたびに1つ追加登録されるため、paintメソッド内からKeyListenerを追加しないでください。

多くの物事があなたのコントロールの外に(例えば、それは他のoccuring AWT UI操作でクリアされていること、それに起こることができるので、その後、その上にComponentや絵画物事のGraphicsオブジェクトを格納に依存しません)。

唯一関連するGraphicsオブジェクトは、paintで受信したインスタンスであり、paintメソッドの範囲内です。

は、したがって、次のコードで:

  • addKeyListenerpaintの外に移動されました。移動するShapeのインデックスとmoveを呼び出し
  • キーリスナー。
  • moveメソッド は、受信したインデックスに応じてShapeを強調表示するよう登録し、repaintを呼び出します。
  • Graphics2Dオブジェクトは、 は外部とは関係がないため、paintのローカル変数として設定されています。
  • paintHighlightedShapeGraphics2Dオブジェクトにpaintメソッドは、現在のパラメータとして渡されたそのGraphics2DオブジェクトとpaintHighlightedShapeを呼び出し、パラメータ
  • として受信し、強調表示Shapeを塗装する責任があります。 main方法は、テストの目的のためにKeyTestに追加されたことを

注、その内容は、あなたのメインクラスで行く必要があります。あなたが強調するために複数の図形を持つことを計画している場合

また、あなたはShapeの配列インデックスをハイライトすることができmoveに渡さShapeの配列、およびインデックスを使用することができます。それはとにかく緑の形状によって非表示になりますので、それは、強調表示されたものであれば

最後に、物事を最適化するために、我々は規則的な形状を描くべきではありません。 強調表示かされている形状に応じて、規則的な形状や緑の図形を描画しますdrawShape(Graphics2D, Shape)メソッドを作成することを検討してください。 paintメソッドからこのメソッドを呼び出し、すべての図形をループします。

import java.awt.BasicStroke; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.Shape; 
import java.awt.Stroke; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.geom.RoundRectangle2D; 

public class KeyTest extends Canvas { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 3L; 
    Color color = Color.BLACK; 
    private static float borderThickness = 5; 
    Shape firstShape = new RoundRectangle2D.Double(20, 40, 300, 50, 10, 10); 
    Shape secondShape = new RoundRectangle2D.Double(20, 150, 300, 50, 10, 10); 

    Shape highlightedShape; 

    public KeyTest() { 
     setBackground(Color.RED); 
     setSize(700, 750); 
    } 

    public static void main(final String[] args) { 
     Frame frame = new Frame("Test App"); 
     final KeyTest keyTest = new KeyTest(); 
     keyTest.addKeyListener(new KeyListener() { 

      @Override 
      public void keyTyped(final KeyEvent e) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void keyPressed(final KeyEvent e) { 
       int keyCode = e.getKeyCode(); 

       System.out.println(keyCode); 
       System.out.println(KeyEvent.VK_UP); 
       if (keyCode == KeyEvent.VK_UP) { 
        System.out.println("Going to move up"); 
        keyTest.move(1); 

       } 
       if (keyCode == KeyEvent.VK_DOWN) { 
        System.out.println("Going to move down"); 
        keyTest.move(2); 

       } 
      } 

      @Override 
      public void keyReleased(final KeyEvent e) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     frame.add(keyTest); 
     frame.setBackground(Color.RED); 
     frame.setLayout(null); 
     frame.setSize(700, 750); 
     frame.setVisible(true); 
    } 

    public void paint(final Graphics graphics) { 

     Graphics2D graphics2D = (Graphics2D) graphics; //TypeCasting to 2D 
     System.out.println("I am inside paint"); 

     //  Smoothening the corners 
     graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 

     //  Apple border color 
     Stroke oldStroke = graphics2D.getStroke(); 
     graphics2D.setStroke(new BasicStroke(borderThickness)); 
     graphics2D.setColor(Color.WHITE); 

     //  Drawing a RoundedRectangle for Apple 
     graphics2D.draw(firstShape); 
     graphics2D.setStroke(oldStroke); 

     //  Setting the Background Color 
     graphics2D.setColor(Color.BLACK); 
     graphics2D.fill(firstShape); 

     //  Setting the font inside the shape 
     Font firstFont = new Font("Serif", Font.BOLD, 35); 
     graphics2D.setFont(firstFont); 
     graphics2D.setColor(Color.WHITE); 
     graphics2D.drawString("Apple", 30, 80); 

     //  Pineapple border color 
     graphics2D.setStroke(new BasicStroke(borderThickness)); 
     graphics2D.setColor(Color.WHITE); 

     //  Drawing a RoundedRectangle for Pineapple 
     graphics2D.draw(secondShape); 
     graphics2D.setStroke(oldStroke); 

     //  Setting the Background Color 
     graphics2D.setColor(Color.BLACK); 
     graphics2D.fill(secondShape); 

     //  Setting the font inside the shape 
     Font secondFont = new Font("Serif", Font.BOLD, 35); 
     graphics2D.setFont(secondFont); 
     graphics2D.setColor(Color.WHITE); 
     graphics2D.drawString("Pineapple", 30, 190); 

     paintHighlightedShape(graphics2D); 

    } 

    private void paintHighlightedShape(final Graphics2D graphics2D) { 

     if (highlightedShape != null) { 

      graphics2D.setColor(Color.GREEN); 
      graphics2D.fill(highlightedShape); 

     } 
    } 

    public void move(final int shapeNumber) { 

     switch (shapeNumber) { 
     case 1: 
      highlightedShape = firstShape; 
      break; 
     case 2: 
      highlightedShape = secondShape; 
      break; 
     default: 

     } 

     System.out.println("Check:" + highlightedShape.getBounds2D()); 
     System.out.println("Moving shape : " + highlightedShape); 
     repaint(); 

     System.out.println("moving out"); 

    } 
} 
+1

内でこれを追加しました理由です、目的を果たしていませんでした。どうもありがとう。 –

+1

あなたは、私が各形状の背景色が黒から緑に変更したい、 – Berger

+0

1.実際に、形状は必ずしも移動する必要はありません:)私は、矢印キーを押すたびに歓迎しています。つまり、矢印キーを押して選択すると、図形が緑色で強調表示されます。 2. repaint()メソッドを使用すると、多くのシェイプをペイントするとちらつきが発生します。しかし、2つの図形しか描かないときはちらつきがありません。 –

関連する問題