2017-06-10 67 views
0

這裏的頂部創建一個按鈕是一段代碼:無法在一個矩形

import java.awt.Color; 
import java.awt.Component; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

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

@SuppressWarnings("serial") 
public class QuitButton extends JPanel implements ActionListener 
{ 
    static JButton button = new JButton("Panic"); 
    Color[] colors = new Color[9]; 

    boolean pressed = false; 

    public QuitButton() 
    { 
     button.addActionListener(this); 
     colors[0] = Color.RED; 
     colors[1] = Color.BLUE; 
     colors[2] = Color.GREEN; 
     colors[3] = Color.YELLOW; 
     colors[4] = Color.BLACK; 
     colors[5] = Color.PINK; 
     colors[6] = Color.MAGENTA; 
     colors[7] = Color.ORANGE; 
     colors[8] = Color.CYAN; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     pressed = true; 
    } 

    public static void main(String args[]) 
    { 
     JFrame frame = new JFrame("Do NOT Panic!!"); 
     QuitButton qb = new QuitButton(); 
     frame.add(qb); 
     frame.add(button); 
     frame.setLayout(new FlowLayout()); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     //frame.pack(); 
     button.requestFocus(); 
     qb.gameLoop(); 
    } 

    public void gameLoop() 
    { 
     while (true) 
     { 
      repaint(); 
      try 
      { 
       Thread.sleep(200); 
      } catch (Exception e) 
      { 
      } 
     } 
    } 

    public void paint(Graphics g) 
    { 
     Graphics2D g2d = (Graphics2D) g; 
     if (pressed == false) 
     { 
      super.paint(g2d); 
      g2d.setColor(Color.GRAY); 
      g2d.fillRect(0, 0, 400, 400); 
     } else 
     { 
      super.paint(g2d); 
      Random r = new Random(); 
      int min = 0; 
      int max = 8; 
      int index = r.nextInt(max - min) + min; 
      g2d.setColor(colors[index]); 
      g2d.fillRect(0, 0, 400, 400); 
     } 
    } 

這項計劃的目的:矩形應該是灰色的前,但是當我點擊恐慌按鈕顏色應該開始改變。
請不要混淆QuitButton類的名稱。
但我的矩形不佔用整個窗口。相反,我得到這樣一個小小的矩形:http://g.recordit.co/xJAMiQu6fM.gif 我認爲這是因爲我使用的佈局,我沒有指定任何地方的按鈕將在上面。可能這就是他們並肩而坐的原因。我不熟悉GUI創建,並感謝您的幫助。

回答

3

你似乎在猜測如何做到這一點,這不是一個學習使用庫的好方法。您的第一步應該是檢查相關教程,其中大部分內容可以在這裏找到:Swing Info由於這看起來是功課,我不會給你一個代碼解決方案,而是建議如何改進:

  • 重寫paintComponent,不畫,因爲後者給出了雙緩衝和風險較小
  • 在你的paintComponent覆蓋,務必先調用父類的的paintComponent方法來清除(邊框和子組件問題的畫少)「髒「 像素。
  • 使用擺動計時器,而不是用於遊戲循環的while循環。這將阻止你的while循環凍結Swing事件線程,這是一個可以凍結程序的問題。谷歌教程,因爲它是非常有幫助的。
  • 在ActionListener的代碼中(這裏可能是Swing Timer的ActionListener)進行隨機化,而不是在繪製代碼中。繪畫代碼不應該改變對象的狀態,而應該只顯示對象的狀態。
  • FlowLayout將尊重組件的preferredSize,並且組件的首選大小爲0,0或接近它。改變這一點。最好覆蓋public Dimension getPreferredSize()並返回與您的矩形尺寸相匹配的尺寸。
  • 避免使用「魔術」數字,例如矩形的大小,而是使用常量或字段。在您的Timer的ActionListener中調用repaint(),以便JVM知道繪製組件。
+0

對不起,但請解釋組件的首選大小是如何爲0,0或接近它。我還想提一下,由於某些原因,我並不是在回顧這篇特定的教程。我遵循的教程看起來很生澀。他們從事情跳到事情沒有解釋太多,我發現自己只是在不做任何事情的情況下完成他們的描述 –

+0

@IshanSrivastava:也許我錯過了你的代碼中的東西 - 我沒有我的IDE在這裏,但是*你在哪裏設置組件的preferredSize或覆蓋'getPreferredSize()'?再一次,我可能錯過了這個,所以請耐心等待。 –

+0

@IshanSrivastava:遵循教程的最佳方式是試驗他們給你的代碼。玩它,然後嘗試將其納入你自己,我相信你會得到它。 –