2010-11-13 86 views
0

我正在尋找一些方向。我想要一個按鈕來爲繪製在圖形內容上的東西提供動力。我以前用jframes和listeners使用過按鈕。但不知怎的,聽衆並未被接受。我相信這與宣佈的兩個類別有關。有誰能告訴我問題是什麼或衝突?與actionListener靜態類衝突

我不能使用//f.addWindowListener(this); //b.addActionListener(this); 它標誌着錯誤,這就是爲什麼他們被寫成評論... = S

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

/* implements ActionListener*/ 
class JFramePaint1 extends JFrame implements ActionListener { 

    public static int activa = 0; 
    public static JButton b = new JButton("b"); 

    public static void main(String[] a) { 

     JFrame f = new JFrame(); 
     f.setTitle("Drawing Graphics in Frames"); 
     f.setSize(800, 650); 
     f.setLocation(200, 50); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.setContentPane(new ContentComponent()); 
     f.getContentPane().add(b); 

     //f.addWindowListener(this); 
     //b.addActionListener(this); 

     f.setVisible(true); 
    } 

    static class ContentComponent extends JPanel { 

     public void paint(Graphics g) { 
      g.setColor(Color.RED); 
      g.fillRect(0, 40, 800, 650); 
      if (activa == 1) { 

       g.setColor(Color.BLACK); 
       g.drawRect(40, 40, 150, 80); 
       int x = 40; 
       int y = 40; 
       for (int i = 0; i < 4; i++) { 

        g.drawRect(x + 10, y + 10, 150, 80); 
        x = x + 10; 
        y = y + 10; 
       } 
      } 
     }//del paint 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == b) { 
      System.out.println("entro"); 
     } 
    } 

    public void windowClosing(WindowEvent e) { 
     System.exit(0); 
    } 

    public void windowOpened(WindowEvent e) {} 

    public void windowClosed(WindowEvent e) {} 

    public void windowActivated(WindowEvent e) {} 

    public void windowDeactivated(WindowEvent e) {} 

    public void windowIconified(WindowEvent e) {} 

    public void windowDeiconified(WindowEvent e) {} 
} 
+0

你可以編輯這個更好一點嗎? – Jim 2010-11-13 00:45:12

+0

重新格式化的代碼;如果不正確請回復。 – trashgod 2010-11-13 01:33:12

回答

2

,因爲你在一個靜態方法是不能使用

//f.addWindowListener(this); 
    //b.addActionListener(this); 

。你認爲this指向什麼?

1

您可能會發現將main()中的所有代碼移動到構造函數中更容易。 Fwiw,我也不知道你爲什麼要擴展JFrame,但也在你的主要方法中創建一個新的JFrame實例。我想你想要這樣的東西(我還沒有測試過,但這是一般的想法)。

FWIW,你可能想要閱讀一個好的Java語言教程,以正確理解「靜態」的含義。

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

/* implements ActionListener*/ 
class JFramePaint1 extends JFrame implements ActionListener { 

    private int activa = 0; 
    private JButton b = new JButton("b"); 

    JFramePaint1() { 
     setTitle("Drawing Graphics in Frames"); 
     setSize(800, 650); 
     setLocation(200, 50); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     setContentPane(new ContentComponent()); 
     getContentPane().add(b); 

     addWindowListener(this); 
     addActionListener(this); 
    } 

    public static void main(String[] a) { 
     new JFramePaint1().setVisible(true); 
    } 

    class ContentComponent extends JPanel { 

     public void paint(Graphics g) { 
      g.setColor(Color.RED); 
      g.fillRect(0, 40, 800, 650); 
      if (activa == 1) { 

       g.setColor(Color.BLACK); 
       g.drawRect(40, 40, 150, 80); 
       int x = 40; 
       int y = 40; 
       for (int i = 0; i < 4; i++) { 

        g.drawRect(x + 10, y + 10, 150, 80); 
        x = x + 10; 
        y = y + 10; 
       } 
      } 
     }//del paint 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == b) { 
      System.out.println("entro"); 
     } 
    } 

    public void windowClosing(WindowEvent e) { 
     System.exit(0); 
    } 

    public void windowOpened(WindowEvent e) {} 

    public void windowClosed(WindowEvent e) {} 

    public void windowActivated(WindowEvent e) {} 

    public void windowDeactivated(WindowEvent e) {} 

    public void windowIconified(WindowEvent e) {} 

    public void windowDeiconified(WindowEvent e) {} 
} 
+0

在分配JFrame f = new JFramePaint1();之後,您也可以在構造函數中執行main方法內的所有東西。 – 2010-11-13 02:10:07