2012-06-14 32 views
-1

我是java平面設計的新手,如果可能的話,我希望你能幫助我一個簡單的例子來幫助我理解JFrames,Timers,SwingControllers的基本功能,以及所有這些東西。你將如何實現以下情況:Swing定時器的基本功能

我們有一個帶有JPanel的JFrame。 當開始執行,JPanel的是白色的,但我們希望它改變它的每兩秒鐘顏色:

public class MiJFrame extends javax.swing.JFrame { 

    public MiJFrame() { 
     initComponents(); 
    } 


    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new MiJFrame().setVisible(true); 
       jPanel1.setBackground(Color.yellow); 
       jPanel1.setBackground(Color.RED); 
      } 
     }); 
    } 

    // Variables declaration - do not modify 
    private static javax.swing.JPanel jPanel1; 
    // End of variables declaration 
} 

起初,我用setBackgroud之間的線程對象的睡眠方法()方法,但它不起作用,因爲它只顯示最後的變化。你如何在這裏使用Timer對象?

+6

*?「你將如何在這裏使用一個Timer對象」 *如果我是在問這個問題的階段,我會檢查出[如何使用Swing定時器](http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)教程。 –

+0

'擴展javax.swing.JFrame'如果不需要,不要擴展GUI組件。只要保留一個參考幀(假設你需要一個參考)。 –

+0

由於它使用了'setBackground()'方法,所以你只需要在做出更改後調用'repaint()'。但是對於這個使用Swing's Timer你是對的,只需閱讀@AndrewThompson提供的鏈接。 – Boro

回答

6

首先,無論何時你需要改變所說的東西的顏色,總是將Opaque屬性設置爲true。就像你的情況,它是JPanel所以首先你必須使用panelObject.setOpaque(true),對於一些Look And Feel s調用這個方法是背景顏色更改生效的必須條件。

不要嘗試這個代碼示例,關於休息:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
/* 
* @see 
* http://stackoverflow.com/q/11036830/1057230 
*/ 

public class ColourTimer 
{ 
    private JPanel contentPane; 
    private Timer timer; 
    private int counter; 
    private Color[] colours = { 
           Color.RED, 
           Color.WHITE, 
           Color.BLUE, 
           Color.DARK_GRAY, 
           Color.YELLOW, 
           Color.LIGHT_GRAY, 
           Color.BLACK, 
           Color.MAGENTA, 
           Color.PINK, 
           Color.CYAN 
           }; 

    private ActionListener timerAction = new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent ae) 
     { 
      if (counter == (colours.length - 1)) 
       counter = 0; 
      contentPane.setBackground(colours[counter++]); 
     }  
    }; 

    public ColourTimer() 
    { 
     counter = 0; 
    } 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Colour Timer"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     contentPane = new JPanel(); 
     contentPane.setOpaque(true); 

     final JButton button = new JButton("STOP"); 
     button.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent ae) 
      { 
       if (timer.isRunning()) 
       { 
        button.setText("START"); 
        timer.stop(); 
       } 
       else 
       { 
        button.setText("STOP"); 
        timer.start(); 
       } 
      } 
     }); 

     frame.getContentPane().add(contentPane, BorderLayout.CENTER); 
     frame.getContentPane().add(button, BorderLayout.PAGE_END); 
     frame.setSize(300, 200); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
     timer = new Timer(2000, timerAction); 
     timer.start(); 
    } 

    public static void main(String... args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new ColourTimer().displayGUI(); 
      } 
     }); 
    } 
} 
+1

你說得對'thingy'記住'setOpaque(true)'是好的方法,但在這種情況下,'JPanel'在默認情況下'true',因此在這裏不是這種情況。其他那麼好的代碼示例(+1)。更加挑剔:)我會將if(counter == 9)' 更改爲'if(counter> = colours.length)' – Boro

+1

@Boro:Thankyou和KEEP SMILING :-),儘管您對條件是一個更好的方法,然後我的,雖然關於'JPanel'具有默認'Opaque'屬性,這可能不是總是正確的,看看這個語句取自[Java文檔](http://docs.oracle.com/javase /tutorial/uiswing/painting/problems.html)其中指出**「確保你的組件是不透明的,例如,JPanels默認情況下在很多但不是所有的外觀上都是不透明的。」** –

+1

好的 - 很好的防禦。以前不知道「JPanel」的真相。謝謝你教我 - 總是樂於學習更多。 Oi :) – Boro