2016-08-10 4 views
0

描画線の関数とコードは、public void actionPerformed(ActionEvent e)のコードのActionListenerで応答されません。 ActionListenerの内部に線を描くことができないのはなぜですか?なぜ線を引く関数を呼び出せないのですか?ActionListenerが描画されておらず、関数を呼び出すこともありません

MainClass.java

import javax.swing.SwingUtilities; 

public final class MainClass { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new CreateFrame(); 
       System.out.println("GUI created Successfully"); 
      } 
     }); 
    } 
} 

//CreateFrame.java 
import javax.swing.JFrame; 

public class CreateFrame { 
    CreateFrame(){ 
     createFrame(); 
    } 
    public void createFrame(){ 
     JFrame frame = new JFrame("Drawing Lines"); 
     frame.setSize(400, 300); 
     frame.setResizable(false); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     //calling a class and adding in the frame 
     frame.add(new CreateDrawings()); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

//CreateDrawings.java 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

public class CreateDrawings extends JPanel { 
    private static final long serialVersionUID = 1L; 
    JButton drawButton; 
    JPanel panel; 

    CreateDrawings() { 
     setLayout(null); 
     drawButton = new JButton("Draw"); 
     drawButton.setBounds(150, 220, 120, 30); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     add(drawButton); 
     g.setColor(Color.blue); 
     g.drawLine(10, 50, 200, 50); 
     drawButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       g.setColor(Color.red);   //NOT WORKING 
       g.drawLine(10, 100, 200, 100); //NOT WORKING 
       drawSomething(g);    //NOT WORKING 
       JOptionPane.showMessageDialog(null, "This is called though!"); 
      } 
     }); 
    }// PaintComponent 

    private void drawSomething(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.black); 
     g.drawLine(10, 150, 200, 150); 
    } 
} 
+1

この変数は、最終的な変数として宣言されなければなりません。最後のGraphics Gにメソッドのパラメータ –

+0

を追加してください。@Nikesh:あなたのコメントをありがとうございます。私はpaintComponent(最終的なグラフィックスg)とdrawSomething(最終的なグラフィックスg)の両方のメソッドに「final」を追加しました。それでも動作しませんでした。 JOptionPaneだけが呼び出されます。 –

答えて

1

グラム非最終変数であるので、あなたは匿名の内部クラスの内部でそれにアクセスすることはできません上記のが好きです。 これについての公式の答えはまだ見つかりませんでした。しかし、私はあなたが前 8、したがって、あなたのソースコードが機能しなかったのJava を使用していると思いますStackOverflow.com

another questionに参照することができます。 Java 8を試してみると、動作します。その理由は、Java 8はについての新しい概念を効果的に最終的に導入することです。。定義hereを参照してください。

は、Java 8に切り替えるのであれば、グラム効果的に最終変数です。したがって、ソースコードをコンパイルすることができます。

+0

あなたの答えは、グラフィックスgとファイナルについてさらに詳しく調べる機会を提供しました。リンクをご提供いただきありがとうございます。 stackoverflow.comには多くの同様の質問があります。私は私の問題の解決策を見つけることができませんでした。私はJava 8を使用しており、グラフィックスgの前で最後の追加は問題を解決しませんでした。どんな提案も非常に感謝しています。 –

+0

EclipseでJava 8でソースコードを試してみましたが、コンパイルできました。どのIDEを使用していますか? – NangSaigon

+0

私もJava 8でEclipseを使用しています。コンパイルします。フレームを作成し、**青い線**のみを描画します。 'ActionListener'の中に**赤い線**を描画したり、' ActionListener'の中の関数が呼び出す**黒い線**を描画しません。私はあなたが青い線だけ、または3つの線すべてを見るのだろうか? –

0

私の教授を含むすべてのプログラマーからのサポートに感謝します。最後に、ActionListenerをアクティブにしてGUIを作成するクラスと関数を呼び出すコードを書くことができました。私は2Dを作成し、フレームにカラフルな図を描くためにいくつかの変更を加えました。ローカル変数はAnnonumusクラスで使用される場合 Output graphical image is here

//MainClass.java 
    import javax.swing.SwingUtilities; 

    public final class MainClass { 
     public static void main(String[] args) { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        CreateFrame frame = new CreateFrame(); 
        frame.createFrame(); 
        System.out.println("GUI created Successfully"); 
       } 
      }); 
     } 
    } 


//CreateFrame.java 
    import javax.swing.JFrame; 

    public class CreateFrame { 
     public void createFrame() { 
      JFrame frame = new JFrame("Drawing Lines"); 
      frame.setSize(400, 300); 
      frame.setResizable(false); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      // calling a class and adding in the frame 
      // creating an object is a good practice, because this way JVM will 
      // guarantee its behavior 
      CreateDrawings drawings = new CreateDrawings(); 
      drawings.createDrawings(); 
      frame.add(drawings); 

      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    } 


//CreateDrawings.java 
    import java.awt.Color; 
    import java.awt.Graphics; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import javax.swing.JButton; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 

    public class CreateDrawings extends JPanel { 
     private static final long serialVersionUID = 1L; 

     private JButton drawButton, exitButton; 
     private JLabel label; 
     private DrawFromClass drawFromClass; 

     public void createDrawings() { 
      setLayout(null); 
      drawButton = new JButton("Draw"); 
      exitButton = new JButton("Exit"); 
      label = new JLabel("Draw Random Colored Lines"); 
      drawButton.setBounds(50, 220, 120, 30); 
      exitButton.setBounds(230, 220, 120, 30); 
      label.setBounds(210, 180, 170, 30); 
      add(drawButton); 
      add(exitButton); 
      add(label); 
      drawFromClass = new DrawFromClass(); 
      drawButton.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        // repaint() creates an event that dispatch thread of the Swing 
        // to invoke paintCompnent method (invokes update and paint too) 
        repaint(); 
       } 
      }); 

      exitButton.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.exit(0); 
       } 
      }); 
     } 

     @Override 
     public void paintComponent(final Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.red); 
      g.drawLine(10, 100, 200, 100); 
      g.setColor(Color.blue); 
      g.drawLine(10, 50, 200, 50); 

      // drawing a line from a method 
      drawFromMethod(g); 

      // drawing a random-colored 2D lines from a class 
      drawFromClass.draw(g); 

     }// PaintComponent 

     // drawing a black line from this method 
     public void drawFromMethod(final Graphics g) { 
      g.setColor(Color.black); 
      g.drawLine(10, 150, 200, 150); 
     } 
    } 

// DrawFromClass.java 
    import java.awt.BasicStroke; 
    import java.awt.Color; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.util.Random; 

    // this class draws three 5px thick random colored lines 
    public class DrawFromClass { 
     public void draw(final Graphics g) { 
      Graphics2D gg = (Graphics2D) g; 
      // draw lines with 5 pixel thick 
      gg.setStroke(new BasicStroke(5)); 

      gg.setColor(getColor()); 
      gg.drawLine(270, 20, 270, 170); 
      gg.setColor(getColor()); 
      gg.drawLine(300, 20, 300, 170); 
      gg.setColor(getColor()); 
      gg.drawLine(330, 20, 330, 170); 
     } 

     // creates a random RGB color 
     public Color getColor() { 
      int[] colors = new int[3]; 
      Random random = new Random(); 
      colors[0] = random.nextInt(255); 
      colors[1] = random.nextInt(255); 
      colors[2] = random.nextInt(255); 
      Color RGB = new Color(colors[0], colors[1], colors[2]); 
      return RGB; 
     } 
    } 
関連する問題