Как я могу заставить свой фон JFrame дико менять цвета? - PullRequest
3 голосов
/ 21 марта 2012

Я создаю «GUI from Hell» и пытаюсь заставить JFrame мигать цветами (быстро менять фон) на достаточно долгое время, чтобы раздражать.Вот что у меня есть:

int changes = gen.nextInt(2000) + 5000;
int red;
int green;
int blue;
Color color;

for (int i = 0; i < changes; i++)
{   
    color = new Color(gen.nextInt(256), gen.nextInt(256),
    gen.nextInt(256));
    // I first tried this...
    frameMain.getContentPane().setBackground(color);
    // Then I tried this, which only
    // appeared to change the color once and then proclaim
    // that it was done:
    panel1.setBackground(color);
    panel2.setBackground(color);
    panel3.setBackground(color);
}

Примечание: Если вы знаете, как легко заставить весь JFrame и все его содержимое менять цвет (не только фон), тобыло бы сумасшедшим и удивительным, так что давайте об этом.

Любое руководство приветствуется!Надеюсь, я только что пропустил что-то глупое ...

... и если у вас есть идея или две для смешного графического эффекта GUI, не стесняйтесь поделиться!:)

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Вот мой взгляд на ваш графический интерфейс из ада, который, кажется, работает хорошо.Это довольно интенсивно.Как вы выполняете обновления?В другой теме?

final JFrame frame = new JFrame();
frame.setSize(600, 400);
frame.getContentPane().setLayout(new GridLayout(3, 1, 20, 20));
final JPanel[] panels = new JPanel[3];
for (int i = 0; i < panels.length; i++) {
    panels[i] = new JPanel();
    panels[i].setOpaque(true);
    frame.getContentPane().add(panels[i]);
}
frame.setVisible(true);
ActionListener action = new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        Random gen = new Random();

        Color color = new Color(gen.nextInt(256), gen.nextInt(256),
                gen.nextInt(256));
        frame.getContentPane().setBackground(color);

        for (int i = 0; i < panels.length; i++) {
            color = new Color(gen.nextInt(256), gen.nextInt(256),
                    gen.nextInt(256));
            panels[i].setBackground(color);
        }
    }
};

Timer t = new Timer(100, action);
t.setRepeats(true);
t.start();
2 голосов
/ 21 марта 2012

Наконец, что-то для развлечения ... Попробуйте. Используйте его как любой JFrame.

class JFrameWild extends JFrame {
private static final long serialVersionUID = 666L;
public JFrameWild(String string) {
    super(string);
    Thread thread = new Thread(new Runnable() {
        public void run() {
            while (true) {
                yoyoMama(JFrameWild.this);
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    thread.setDaemon(true);
    thread.start();
}
private void yoyoMama(Object object) {
    if (object instanceof Container) {
        Container c = (Container) object;
        Component[] components = c.getComponents();
        for (Component component : components) {
            yoyoMama(component);
            // put extra "wild" stuff here
            component.setBackground((new Color((int) (Math.random() * (double) (0xFFFFFF)))));
        }
    } else {
        if (object instanceof Component) {
            Component component = (Component) object;
            // put extra "wild" stuff here
            component.setBackground((new Color((int) (Math.random() * (double) (0xFFFFFF)))));
        }
    }
}
}
2 голосов
/ 21 марта 2012

Я бы предложил использовать Swing Timer для многократных событий в Swing GUI, возможно , этот пример может помочь вам с другими вашими мечтами

JFrame невозможно покрасить, но работает для ContentPane г.э. JFrame.getContentPane.setColor(Color.red)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...