【问题标题】:How can I make this timer() work as I want?我怎样才能让这个 timer() 按我的意愿工作?
【发布时间】:2015-07-29 11:31:45
【问题描述】:

我之前的代码有点麻烦。它正在做我想做的事,但是我只能调用一次该方法,如果我调用它的次数超过了它就不起作用了,基本上它只能起作用一次。所以现在这个ballG是一个对象。它以白色开始,将其设置为绿色,有延迟,然后将其设置回白色,这是完美的。问题是因为我做了 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);








}

}

【问题讨论】:

    标签: java swing timer colors jframe


    【解决方案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 序列并将其分解为单个元素,通过在 - 字符上吐出 String (这就是为什么你“编码”对我来说没有意义)。然后循环遍历这个集合并相应地改变“球”的状态。

    Timercontinues` 直到没有更多的序列了...

    避免使用null 布局,像素完美的布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

    【讨论】:

    • 我调用了 3 次,它只变绿变回白色一次,附加代码:/
    • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将导致更少的混乱和更好的响应
    • 它使用JFrame,我应该把整个东西都贴出来吗?
    • 只发布与问题相关的代码,这些代码是可编译和可运行的,并且可以证明您的问题。我们不应该修改它来让它运行
    • 我可能应该添加一些信息,我只单击了一次动作侦听器,现在我想这可能是问题......基本上我想点击一个按钮开始然后将过程自动化......到目前为止,这是我唯一取得进展的事情。 @MadProgrammer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多