2016-10-28 112 views
0
package work; 

import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 
import javax.swing.JTextField; 
import java.util.Timer; 
import java.util.TimerTask; 



class NewJPanel extends JPanel{ 
    //private MoveButton button; 
    static MoveButton button; 
    JTextField textfield; 

    NewJPanel(){ 
     setLayout(null); 
     textfield=new JTextField(); 
     textfield.setBounds(600, 50, 100, 40); 
     button=new MoveButton(); 
     //button.setBounds(0, 0, 50, 50); 
     //add(button); 
     add(textfield); 
     //repaint(); 
     System.out.println("Newpanel construct"); 
     //System.out.println("1"); 
     //button=new MoveButton(); 
     //button.addActionListener(button); 
     //add(button); 
    } 

    public static void main(String[] args){ 
     JFrame gui=new JFrame(); 
     gui.setSize(800, 800); 
     gui.setVisible(true); 

     NewJPanel panel=new NewJPanel(); 
     //panel.setLayout(null); 
     panel.add(button); 
     gui.add(panel); 

    } 

    @Override public void paintComponent(Graphics g){ 
     System.out.println("drawing"); 
     super.paintComponent(g); 
     for(int i=0;i<400;i+=100) 
      for(int j=0;j<400;j+=100) 
       g.drawOval(i, j, 100, 100); 
     //button.setBounds(button.getx(),button.gety(),50,50); 
     textfield.setText(Integer.toString(button.get())); 
    } 
} 

class MoveButton extends JButton implements ActionListener{ 

    private Random randomgenerator=new Random(); 
    private int indexX=0; 
    private int indexY=0; 
    private int score=0; 

    public MoveButton(){ 
     setBounds(0, 0, 50, 50); 
     addActionListener(this); 
     System.out.println("movebutton construct"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 
     //setBounds(200,0,100,100); 
     indexX=100*randomgenerator.nextInt(4); 
     indexY=100*randomgenerator.nextInt(4); 
     score+=1; 
     //System.out.println(indexX); 
     setBounds(indexX, indexY, 50, 50); 
     repaint(); 
    } 

    public int getx(){ 
     return indexX; 
    } 

    public int gety(){ 
     return indexY; 
    } 

    public int get(){ 
     return score; 
    } 
} 

class TimerTaskTest extends java.util.TimerTask{ 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     System.out.println("Start!"); 
    } 

} 

這是我的代碼,我嘗試在JPanel中繪製圓,我真的不明白爲什麼paintComponent不起作用。 任何人都可以幫我嗎?Java爲什麼我的方法paintComponent()不起作用?

+0

您的代碼(如提交)不會進行編譯。 –

+1

什麼意思'不起作用'? – Jens

回答

1

您的代碼可以工作 - 如果您可以在面板上觸發repaint()事件。

問題是,您正在初始化主線程而不是EDT的GUI。因此,顯示JFrame之前,您可以將NewJPanel添加到它。只要將固定佈局添加NewJPanel不會觸發重繪事件。

您應該將主要的方法變更爲

public static void main(String[] args){ 
    SwingUtilities.invokeLater(() -> { 
     JFrame gui=new JFrame(); 
     gui.setSize(800, 800); 
     gui.setVisible(true); 

     NewJPanel panel=new NewJPanel(); 
     //panel.setLayout(null); 
     panel.add(button); 
     gui.add(panel); 
    }); 
} 

或者,如果你不能使用Java8:

public static void main(String[] args){ 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame gui=new JFrame(); 
      gui.setSize(800, 800); 
      gui.setVisible(true); 

      NewJPanel panel=new NewJPanel(); 
      //panel.setLayout(null); 
      panel.add(button); 
      gui.add(panel); 
     } 
    }); 
} 
+0

'gui.setSize(800,800);'不要設置GUI的大小,這只是猜測。在添加完所有組件後,調用'pack()',最後調用'gui.setVisible(true);'以獲得組織良好的GUI。 –

相關問題