2017-06-08 76 views
1

我寫了下面的代碼:的JPanel - 一個JPanel的錯誤更改背景顏色

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test extends JFrame{ 

    public Test() { 
     this.setTitle("Test"); 
     this.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     JPanel jPanel = new JPanel() { 
      public void paint(Graphics g) { 
       g.setColor(Color.GREEN); 
       g.fillOval(100, 100, 100, 100); 
       g.setColor(Color.BLACK); 
       g.drawLine(0, 0, 100, 100); 
      } 
     }; 
     jPanel.setSize(500, 500); 
     jPanel.setBackground(Color.RED); 
     this.add(jPanel); 
     this.setVisible(true); 
     this.setSize(500, 500); 
    } 

    public static void main(String[] args) { 
     Test test = new Test(); 
    } 
} 

我要畫一個圓,線,改變屏幕的背景顏色爲紅色,但是當我運行該程序的屏幕看起來如下: Screen

代碼中的錯誤在哪裏?坦克你

回答

3

首先,不要覆蓋paint,但paintComponent

然後,setBackground的Javadoc說:

JComponent的直接子類必須重寫paintComponent兌現 此屬性。

所以調用此方法將被自己的情況下,什麼也不做,除非你調用父類的paintComponent(或繪製背景自己,但是這將是矯枉過正)。

在任何情況下,建議撥打super.paintComponent,因爲父執行可能執行一些清理或其他有用的操作。

這裏是你的代碼的修改版本通吃的對此加以考慮:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test extends JFrame { 

    public Test() { 
     this.setTitle("Test"); 
     this.addWindowListener(new WindowAdapter() { 
      public void windowClosing(final WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     JPanel jPanel = new JPanel() { 
      @Override 
      public void paintComponent(final Graphics g) { 
       // call parent method 
       super.paintComponent(g); 

       // OR paint background yourself : 
       // g.setColor(getBackground()); 
       // g.fillRect(0, 0, getWidth(), getHeight()); 


       // paint other things 
       g.setColor(Color.GREEN); 
       g.fillOval(100, 100, 100, 100); 
       g.setColor(Color.BLACK); 
       g.drawLine(0, 0, 100, 100); 
      } 
     }; 
     jPanel.setSize(500, 500); 
     jPanel.setBackground(Color.RED); 
     this.add(jPanel); 
     this.setVisible(true); 
     this.setSize(500, 500); 
    } 

    public static void main(final String[] args) { 
     Test test = new Test(); 
    } 
} 
+0

謝謝你的幫助,你推薦任何書籍,網頁或其他資源來了解Java的GUI開發? – Lemark

+0

@Lemark:來自Oracle的教程是一個很好的開始:http://docs.oracle.com/javase/tutorial/uiswing/ – Berger