2014-02-07 26 views
2

我寫了一個簡單的程序,在打印「生日快樂!」時隨機更改背景顏色。屏幕上,但我看到一個不需要的間距。我怎樣才能解決這個問題?JPanel和Frame之間的默認顏色間距

Birthday Program

Birthday.java

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class Birthday { 

    DrawString panel = new DrawString(); 

    public Birthday() { 
     JFrame f = new JFrame(); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(panel); 
     f.setTitle("Happy Birthday!"); 
     f.setLocation(10, 10); 
     f.setVisible(true); 
     f.setResizable(false); 
     f.pack(); 

     Timer timer = new Timer(500, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       panel.repaint(); 
      } 
     }); 
     timer.start(); 
    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Birthday(); 
      } 
     }); 
    } 
} 

DrawString.java

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import javax.swing.JPanel; 

public class DrawString extends JPanel { 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     int width = getWidth(); 
     int height = getHeight(); 

     int x = 350; 
     int y = 250; 
     int red = random(0,255); 
     int green = random(0,255); 
     int blue = random(0,255); 
     Color black = new Color(0,0,0); 

     Color newColor = new Color(red,green,blue); 
     g.setColor(newColor); 
     g.fillRect(0,0,1000,500); 
     g.setColor(black); 
     g.setFont(new Font(null,Font.BOLD,40)); 
     g.drawString("Happy Birthday!",x,y); 
    } 

    public static int random(int min, int max) 
    { 
     int range = max - min + 1; 
     int number = (int) (range * Math.random() + min); 
     return number; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(1000, 500); 
    } 
} 

回答

8

這與一個可調整大小和不可調整大小的框架邊框之間的差異有關。

因爲你調用setResizable之前調用setVisible,窗口還沒有反應到框架裝飾的變化...

嘗試調用setVisible持續,例如...

f.setResizable(false); 
    f.pack(); 
    f.setVisible(true); 

這通常是建立通用UI的好建議,在建立UI內容和屬性後最後調用setVisible;)

+0

在構造函數的末尾調用'f.pack()'也起作用。 –

+0

@HugoSousa是的,但他們已經調用過'pack'一次......不妨利用這個事實;) – MadProgrammer

+1

另外,'f.add(panel);'應該是'f.setContentPane(panel) ;',但這並沒有解決額外的空間問題。只是一個建議。 –