2013-01-13 40 views
2

我創建了一個JFrame,它包含一個JPanel。我創建了一些JLabel。我可以將JLabel添加到JPanel,並正確顯示它們。但我想執行它們,以便它們按順序顯示;顯示每個JLabel之間的時間延遲。如何在添加組件到JFrame之間添加時間延遲?

搜索StackOverfLow後,我試了一些代碼,但它沒有效果! 那麼如何使用定時器通過設置時間延遲來先後顯示組件(標籤)。

我不想爲我的代碼特別是在答案中修復。只需顯示如何以延遲的方式顯示任何類型的組件,每個組件在一段時間後顯示。就這些。我提供了我的代碼來展示我試圖解決問題的努力。

首先這是一個JLabel的子類,使用方法:(它沒有問題)

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.BorderFactory; 
import javax.swing.JLabel; 

public class DLabel extends JLabel 
{ 
    Dimension size = new Dimension(70, 75); 
    Font font = new Font(Font.SANS_SERIF, 12, 35); 

    public DLabel(String t) 
    { 
     this.setPreferredSize(size); 
     this.setBorder(BorderFactory.createBevelBorder(1, Color.white, Color.black)); 
     this.setVerticalAlignment(JLabel.CENTER); 
     this.setHorizontalAlignment(JLabel.CENTER); 
     this.setText(t); 
     this.setFont(font); 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     Color color1 = new Color(226, 218, 145); 
     Color color2 = color1.brighter(); 
     int w = getWidth(); 
     int h = getHeight(); 
     GradientPaint gp = new GradientPaint(
       0, 0, color1, 0, h, color2); 
     g2d.setPaint(gp); 
     g2d.fillRect(0, 0, w, h); 
     super.paintComponent(g); 
    } 
} 

使用該DLabel類的其他類:

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

public class DelayedLabels extends JPanel 
{ 

    static JFrame frame; 
    Timer timer; //timer to be used for dealy 

    DLabel card_1; //Defining the DLabels 
    DLabel card_2; 
    DLabel card_3; 
    JLabel[] labelsArray; 

    public DelayedLabels() 
    { 
     this.setLayout(null); 

     card_1 = new DLabel("1"); 
     card_2 = new DLabel("2"); 
     card_3 = new DLabel("3"); 

     labelsArray = new DLabel[3]; //create the array 

     createLabelsArray(); //add the Labels Objects to labelsArray 
     setLabelsLocations(labelsArray); // set the locations of the Labels to be displayed on the JPanel 
     addLabelsToPanel(labelsArray); //The adding of the Labels to the JPanel 
    } 

    private void createLabelsArray() 
    { 
     labelsArray[0] = card_1; 
     labelsArray[1] = card_2; 
     labelsArray[2] = card_3; 
    } 

    private void setLabelsLocations(JLabel[] labels) 
    { 
     int length = labels.length; 
     int gap = 10; 
     int counter = 10; 
     for (int i = 0; i < length; i++) 
     { 
      labels[i].setBounds(170, counter, 60, 70); 
      counter = counter + labels[i].getBounds().height + gap; 

     } 
    } 

    private void addLabelsToPanel(JLabel[] labels) 
    { 
     for (int i = 0; i < labels.length; i++) 
     { 
      frame.revalidate(); 
      frame.repaint(); 
      this.add(labels[i]); 
      timer = new Timer(1000, timerAction); //timer to use with 1000 milliseconds 
      timer.start(); 
     } 
    } 
    private ActionListener timerAction = new ActionListener() //action to be invoked after each label added 
    { 
     @Override 
     public void actionPerformed(ActionEvent ae) 
     { 
      frame.revalidate(); 
      frame.repaint(); 
     } 
    }; 

    private static void createAndShowGUI() 
    { 
     frame = new JFrame(); 
     frame.setSize(600, 700); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     DelayedLabels demo = new DelayedLabels(); 
     demo.setOpaque(true); 
     frame.add(demo); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       UIManager.put("swing.boldMetal", Boolean.FALSE); 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+1

爲了更好地幫助更快,發佈[SSCCE](http://sscce.org/)。在SSCCE中,使用庫存標準'JLbabel'。 2)'labels [i] .setBounds(170,counter,60,70);'***使用佈局!*** –

+0

@Andrew Thompson *我不想修復我的代碼,特別是在答案中。 **只顯示如何以延遲方式顯示任何類型的組件,每個組件在一段時間後顯示。這就是全部。* –

+1

*「已經是」*否,不是。 SSCCE有*** 1 ***源文件。要製作一個源文件,您需要將'DLabel'類降級爲默認值,並將其放入其他源文件中。但是,同樣的問題可以用'JLabel'來證明(參見下面的我的SSCCE),這表明整個DLabel是這個問題的附屬部分,因此不應該包括在內。 –

回答

5
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class DelayedLabels extends JPanel { 

    static JFrame frame; 
    Timer timer; //timer to be used for dealy 
    JLabel card_1; //Defining the JLabels 
    JLabel card_2; 
    JLabel card_3; 
    JLabel[] labelsArray; 
    ActionListener listener; 

    public DelayedLabels() { 
     listener = new ActionListener() { 

      int i = 0; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Component c = DelayedLabels.this.getTopLevelAncestor(); 
       DelayedLabels.this.add(labelsArray[i++]); 
       c.validate(); 
       c.repaint(); 
       if (i==labelsArray.length) { 
        timer.stop(); 
       } 
      } 
     }; 
     this.setLayout(new GridLayout(0, 1, 20, 20)); 

     card_1 = new JLabel("Label 1"); 
     card_2 = new JLabel("Label 2"); 
     card_3 = new JLabel("Label 3"); 

     labelsArray = new JLabel[3]; //create the array 

     createLabelsArray(); //add the Labels Objects to labelsArray 
     timer = new Timer(1000,listener); 
     timer.start(); 
    } 

    private void createLabelsArray() { 
     labelsArray[0] = card_1; 
     labelsArray[1] = card_2; 
     labelsArray[2] = card_3; 
    } 

    private static void createAndShowGUI() { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     DelayedLabels demo = new DelayedLabels(); 
     demo.setOpaque(true); 
     frame.add(demo, BorderLayout.PAGE_START); 
     frame.pack(); 
     frame.setSize(200, 150); 
     frame.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       UIManager.put("swing.boldMetal", Boolean.FALSE); 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

非常感謝您的回答。我對[SSCCE](http://sscce.org)感到抱歉。我唯一一次讀到它是在一年前,我依靠我的記憶。 –

+2

我發現它更容易記住,因爲我寫了它。 ;) –