【问题标题】:Java swing - frequently changing color of the frameJava swing - 经常改变框架的颜色
【发布时间】:2019-08-28 14:21:44
【问题描述】:

我遇到了更改框架颜色的问题。我创建了计时器 timer1 并最初将框架的颜色设置为 co1_ 例如 (RED)。 现在,当我尝试将实际颜色与预定义值进行比较时,我总是收到以下信息:

框架颜色为:javax.swing.plaf.ColorUIResource[r=238,g=238,b=238]

并且框架颜色仍然保持红色。你知道我做错了什么吗? :)

提前致谢。

    Color col1 = Color.RED;
    Color col1_= new Color(255,0,0);
    Color col2 = Color.GREEN;
    Color col2_ = new Color(238,238,238);

    JFrame jfrmForm = new JFrame();
    jfrmForm.setSize(400, 300);
    jfrmForm.setLocation(300,300); 
    jfrmForm.setVisible(rootPaneCheckingEnabled);
    jfrmForm.getContentPane().setBackground(col1_);                      

    //getting color from Frame
    Color c = getContentPane().getBackground();       

    timer.start(); 
    timer.setRepeats(false);

    Timer timer1 = new Timer(1000*frekvCmbBox, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (c.equals(col1_)) {
                jfrmForm.getContentPane().setBackground(col2_);
                System.out.println("Frame color is_: " + c.toString());
            }
            else {
                jfrmForm.getContentPane().setBackground(col1_);
                System.out.println("Frame color is: " + c.toString());
            }                 
        }
    });

    timer1.start();

【问题讨论】:

  • 顺便说一句 - 移动 Color c = getContentPane().getBackground(); inside action执行方法!

标签: java swing colors timer background


【解决方案1】:

Andrew,感谢您的帮助 - 现在可以使用了!

Moving Color c = getContentPane().getBackground(); 

到里面的action执行方法是关键。 而且,我很抱歉回答 - 似乎我没有仔细阅读论坛规则。

【讨论】:

  • 现在我意识到我犯了一个非常愚蠢的错误——我只得到了框架的颜色一次。所以,定时器在进行颜色比较时,他只有帧的初始颜色,所以他将帧的颜色设置为另一个值,实际上每次都是一样的。 :)
  • 该评论作为答案的一部分也会更好!在获取提示并找出问题的来源方面做得很好。 :)
【解决方案2】:

您可以跟踪颜色,而无需检查当前应用于背景的颜色:

import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.border.Border;

public class SwingMain {

    private static Color[] colors = {Color.ORANGE, Color.YELLOW, Color.PINK, Color.CYAN};
    private static int counter = 0;
    public static void main(String[] args) {

        JFrame jfrmForm = new JFrame();
        jfrmForm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jfrmForm.setLocationRelativeTo(null);
        jfrmForm.getContentPane().setBackground(colors[counter++]);
        //add some content
        JLabel label = new JLabel("Background color chaging test");
        Border padding = BorderFactory.createEmptyBorder(10, 10, 10, 10);
        label.setBorder(padding);
        jfrmForm.add(label);
        jfrmForm.pack();

        Timer timer = new Timer(1000, ae -> {

            jfrmForm.getContentPane().setBackground(colors[counter++]);
            if (counter >= colors.length) {
                counter = 0;
            }
        });

        timer.start();
        jfrmForm.setVisible(true);
    }
}

【讨论】:

  • 请注意,counter++%2 将始终为 0 或 1。好吧,至少在 Integer.MAX_VALUE 之前。以每秒一个“滴答”的速度,将超过 68 年。 ;)
  • @AndrewThompson 不错的技巧,有足够的时间担心它会溢出:-)。对于随机 2 状态标志,我也使用 new Random().nextBoolean()。在这种情况下,我希望它在 0 - 2 的范围内。
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2022-01-05
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多