2015-05-18 98 views
1

我之前的代碼有點麻煩。它正在做我想做的事,但我只能調用一次該方法,如果我調用它比它不工作,本質上它只能工作一次。所以現在這個球是一個對象。它從白色開始,將其設置爲綠色,延遲,然後將其設置爲白色,這是完美的。問題是因爲我做了timerG.start();我不會結束它,當我再次調用它時,它不起作用。如果我做timerG.stop();它會忽略動作事件並將其保留爲綠色,而不會回到白色。我怎樣才能做到這一點,所以我可以多次調用這個方法?我如何使這個計時器()工作,因爲我想?

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import javax.swing.JTextArea; 
import javax.swing.Timer; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

import javax.swing.JTextPane; 
import javax.swing.JLabel; 

import java.awt.Color; 
import java.awt.Font; 
import java.util.concurrent.TimeUnit; 

import javax.swing.JLayeredPane; 
import javax.swing.JEditorPane; 


public class frame extends JFrame { 

private JPanel contentPane; 
private JTextField textEntered; 
private JTextArea displayT; 
private JTextPane textPane; 
private JLabel instructions; 
private JLabel instructions3; 
private JLabel instructions2; 
private JLabel ballR; 
private JLabel ballG; 
private JLabel ballB; 
private JPanel panel; 
private JTextArea textArea; 
private JLabel instructions4; 

public String translator(String x) 
{ 
    String y = ""; 
    for(int i = 0; i< x.length(); i++) 
    { 
     y = y + code(x.charAt(i)) + " "; 
    } 
    return y; 

} 

private String code(char a) 
{ 

    switch (a) { 
    case 'e' : return "R"; 
    case 't' : return "B"; 
    case 'a' : return "G"; 
    case 'o' : return "RB"; 
    case 'i' : return "RG"; 
    case 'n': return "BG"; 
    case 's' : return "R-R"; 
    case 'h' : return "R-B"; 
    case 'r' : return "R-G"; 
    case 'd' : return "R-RB"; 
    case 'l' : return "R-RG"; 
    case 'c' : return "R-BG"; 
    case 'u' : return "B-R"; 
    case 'm' : return "B-B"; 
    case 'w' : return "B-G"; 
    case 'f' : return "B-RB"; 
    case 'g' : return "B-RG"; 
    case 'y' : return "B-BG"; 
    case 'p' : return "G-R"; 
    case 'b' : return "G-B"; 
    case 'v': return "G-B"; 
    case 'k' : return "G-RB"; 
    case 'j' : return "G-RG"; 
    case 'x' : return "G-BG"; 
    case 'q' : return "RB-R"; 
    case 'z' : return "RB-G"; 
    case ' ' : return "RB-B"; 
    case '0' : return "RB-RB"; 
    case '1' : return "RB-RG"; 
    case '2' : return"RB-BG"; 
    case '3' : return "RG-R"; 
    case '4' :return "RG-B"; 
    case '5' : return "RG-G"; 
    case '6' : return "RG-RB"; 
    case '7' : return "RG-RG"; 
    case '8' : return "RG-BG"; 
    case '9' : return "BG-R";  
    } 
    return "Z"; 

} 

//Trying to get 1/4 of these methods to work, colorRed, colrGreen, colorBlue,setWhite 
private void colorRed() 
{ 

    Timer timerR = new Timer(750, new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      ballR.setForeground(Color.RED);//or RED, depending 
     } 
    }); 
    //timer.setRepeats(false);//don't repeat if you don't want to 
    timerR.start(); 
    ballR.setForeground(Color.WHITE); 

} 

private void colorGreen() 
{ 

    ballG.setForeground(Color.GREEN); 
    Timer timerG = new Timer(750, new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      ballG.setForeground(Color.WHITE);//or RED, depending 


     } 
    }); 
    timerG.setRepeats(false); 
    timerG.start(); 


} 

private void colorBlue() 
{ 
    Timer timerB = new Timer(750, new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      ballB.setForeground(Color.BLUE);//or RED, depending 
     } 
    }); 
    //timer.setRepeats(false); 
    timerB.start(); 

    ballR.setForeground(Color.WHITE); 
} 

private void setWhite() 
{ 
    Timer timer = new Timer(750, new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      ballB.setForeground(Color.WHITE); 
      ballR.setForeground(Color.WHITE); 
      ballG.setForeground(Color.WHITE); 
     } 
    }); 
    //timer.setRepeats(false); 
    timer.start(); 

} 





public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       frame frame = new frame(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 


public frame() { 
    setTitle("RBG Translator"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 800, 529); 
    contentPane = new JPanel(); 
    contentPane.setBackground(Color.GRAY); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    textEntered = new JTextField(); 
    textEntered.setText("Enter String..."); 
    textEntered.setBounds(10, 124, 261, 50); 
    contentPane.add(textEntered); 
    textEntered.setColumns(10); 

    JButton submit = new JButton("Submit"); 
    submit.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      ballR.setForeground(Color.WHITE); 
      ballB.setForeground(Color.WHITE); 
      ballG.setForeground(Color.WHITE); 
      String input = textEntered.getText().toLowerCase(); 
      String output = translator(input); 
      displayT.setText(output); 
      //colorRed(); 
      colorGreen(); 

      //colorRed(); 
      //colorBlue(); 
      colorGreen(); 
      colorGreen(); 



     } 
    }); 
    submit.setBounds(281, 125, 138, 50); 
    contentPane.add(submit); 

    displayT = new JTextArea(); 
    displayT.setBounds(10, 246, 409, 234); 
    displayT.setLineWrap(true); 
    contentPane.add(displayT); 

    instructions = new JLabel("Please enter a word or a phrase that you would like to be transalted\r\n"); 
    instructions.setBounds(10, 11, 396, 14); 
    contentPane.add(instructions); 

    instructions3 = new JLabel("Below is a translated text of the word or phrase submitted"); 
    instructions3.setBounds(10, 205, 409, 34); 
    contentPane.add(instructions3); 

    instructions2 = new JLabel("into RBG code. Currently A-Z, 0-9, and space are permitted."); 
    instructions2.setBounds(10, 24, 396, 34); 
    contentPane.add(instructions2); 

    panel = new JPanel(); 
    panel.setBounds(470, 25, 304, 169); 
    contentPane.add(panel); 

    ballR = new JLabel("\u2022"); 
    panel.add(ballR); 
    ballR.setForeground(Color.RED); 
    ballR.setFont(new Font("Tahoma", Font.PLAIN, 99)); 

    ballB = new JLabel("\u2022"); 
    panel.add(ballB); 
    ballB.setForeground(Color.BLUE); 
    ballB.setFont(new Font("Tahoma", Font.PLAIN, 99)); 

    ballG = new JLabel("\u2022"); 
    panel.add(ballG); 
    ballG.setForeground(Color.GREEN); 
    ballG.setFont(new Font("Tahoma", Font.PLAIN, 99)); 

    textArea = new JTextArea(); 
    textArea.setLineWrap(true); 
    textArea.setColumns(4); 
    textArea.setText("a:G k:G-RB u:B-R 4:RG-B   " 
      +  "b:G-B l:R-RG v:G-G 5:RG-G   " 
      +  "c:R-BG m:B-B w:B-G 6:RG-RB   " 
      +  "d:R-RB n:BG x:G-BG 7:RG-RG   " 
      +  "e:R o:RB y:B-BG 8:RG-BG   " 
      +  "f:B-RB p:G-R z:RB-G 9:BG-R   "      
       + "g:B-RG q:RB-R 0:RB-RB :RB-B    " 
       + "h:R-B r:R-G 1:RB-RG          " 
       + "i:RG s:R-R 2:RB-BG          " 
      + "j:G-RG t:B    3:RG-R     " ); 

    textArea.setBounds(429, 246, 345, 234); 
    contentPane.add(textArea); 

    instructions4 = new JLabel("Key\r\n"); 
    instructions4.setBounds(429, 205, 345, 34); 
    contentPane.add(instructions4); 








} 

}

回答

1

(我真的不知道你的 「代碼」 正在做的事情,如R-RB似乎沒有什麼意義,你怎麼顯示R,G和B?)

好的,你需要開始生成你想要顯示的某種序列。這將允許Timer根據所述當前序列充當僞循環和更新UI設置

private String[] sequence; 
private int index; 
private Timer timer; 
//... 
public Test() { 
    //... 
    JButton submit = new JButton("Submit"); 
    submit.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      ballR.setForeground(Color.WHITE); 
      ballB.setForeground(Color.WHITE); 
      ballG.setForeground(Color.WHITE); 
      String input = textEntered.getText().toLowerCase(); 
      String output = translator(input); 
      displayT.setText(output); 

      timer.stop(); 

      System.out.println(output); 
      List<String> firstPass = new ArrayList<>(Arrays.asList(output.split(" "))); 
      List<String> fullPass = new ArrayList<>(25); 
      for (String pass : firstPass) { 
       if (pass.contains("-")) { 
        String[] parts = pass.split("-"); 
        fullPass.addAll(Arrays.asList(parts)); 
       } else { 
        fullPass.add(pass); 
       } 
      } 

      sequence = fullPass.toArray(new String[fullPass.size()]); 
      index = 0; 
      timer.start(); 

     } 
    }); 

基本上,這假設每個空間將被顯示

接下來,需要一個單獨的序列設置一個單一Timer這可以通過序列

timer = new Timer(750, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     ballR.setForeground(Color.WHITE); 
     ballG.setForeground(Color.WHITE); 
     ballB.setForeground(Color.WHITE); 
     if (index < sequence.length) { 
      String set = sequence[index]; 
      System.out.println(index + " = " + set); 
      for (char c : set.toCharArray()) { 
       if ('R' == c) { 
        ballR.setForeground(Color.RED); 
       } else if ('G' == c) { 
        ballG.setForeground(Color.GREEN); 
       } else if ('B' == c) { 
        ballB.setForeground(Color.BLUE); 
       } 
      } 
     } else { 
      timer.stop(); 
     } 
     index++; 
    } 
}); 

好的打,所以,這將在下次String序列和將其分解成invidual元件,由所述吐涎String-字符(這就是爲什麼你「編碼」對我來說沒有意義)。然後它循環遍歷這個集合並相應地改變「球」的狀態。

Timer continues`直到有沒有留下更多的序列......使用null佈局

避免,像素完美的佈局是現代的UI設計中的錯覺。影響組件的個體大小的因素太多,其中沒有一個可以控制。 Swing旨在與佈局經理一起工作,放棄這些將導致問題和問題無法結束,您將花費越來越多的時間來嘗試糾正

+0

我稱它爲三次,它只會將其更改爲綠色,回到白色一次,使用附加代碼:/ – Renuz

+1

考慮提供一個[可運行的示例](https://stackoverflow.com/help/mcve),它演示了您的問題。這不是代碼轉儲,而是您正在做的事情的一個例子,它突出了您遇到的問題。這將導致更少的混淆和更好的反應 – MadProgrammer

+0

它使用JFrame,我應該發佈整個事情? – Renuz

相關問題