A co takto magicke SwingUtilities.invokeLater():

package test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.metal.MetalButtonUI;

public class Main extends JFrame {

  private JButton button;
  private boolean prepnuti = true;
  private Color colorNew = new Color(255, 0, 0);
  private Color colorOld;

  public Main() {

    JPanel panel = new JPanel();
    panel.setBackground(new Color(0, 0, 250));

    button = new JButton("Button");
    button.setUI(new MetalButtonUI());
    colorOld = button.getBackground();
    button.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent e) {
        if (prepnuti) {
          button.setBackground(colorNew);
        } else {
          SwingUtilities.invokeLater(new Runnable() {
            public void run() {
              button.setBackground(colorOld);
            }
          });
        }
        prepnuti = !prepnuti;
      }
    });

    panel.add(button);
    this.getContentPane().add(panel);

    pack();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
  }

  public static void main(String[] args) {
    new Main();
  }
}



Lukas Adamek | FAYN Telecommunications said the following on 21.9.2006 17:46:

Zapomnel jsem uvest jednu dulezitou věc.

JPanelu, do ktereho JButton vkladam také definuji Background. A to je jadro pudla a problem, protože potom button.updateUI() nefunguje.

 

Zde uvadim kod:

****************************************************

package test;

 

import java.awt.Color;

import java.awt.Container;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.plaf.metal.MetalButtonUI;

 

public class Main extends JFrame {

   

    private JButton button;

    private boolean prepnuti = false;

 

    public Main() {

        Container pane = this.getContentPane();

        JPanel panel = new JPanel();

        panel.setLayout(new FlowLayout());

        panel.setBackground(new Color(0,0,250));

        

        button = new JButton("Button");

        button.setUI(new MetalButtonUI());

        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {

                if (prepnuti) {

                    button.setBackground(new Color(255,0,0));

                    button.updateUI();

                    prepnuti = !prepnuti;

                } else {

                    button.setBackground(null);

                    button.updateUI();

                    prepnuti = !prepnuti;

                }

            }

        });

       

        panel.add(button);

        pane.add(panel);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        pack();

        setVisible(true);

    }

 

    public static void main(String[] args) {

        new Main();

    }

}

****************************************************

 

 

 

 

 

Ahoj.

Co treba takto:

updateUI

<http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JButton.html#updateUI%2

8%29> ()

Resets the UI property to a value from the current look and feel.

 

Vity

 

 

________________________________

 

From: konference-bounces na java.cz [mailto:konference-bounces na java.cz] On

Behalf Of Lukas Adamek | FAYN Telecommunications

Sent: Thursday, September 21, 2006 9:10 AM

To: konference na java.cz

Subject: JButton - navrat k puvodnimu UI

 

 

 

Ahoj

 

 

 

Potrebuji udelat blikajici

 

JButton activeButton;

 

 

 

Vzhled tlacitka nastavuji prikazem

 

activeButton.setUI(new MetalButtonUI());

 

 

 

Blikani delam jednoduse zmenou barvy pozadi, tj.

 

activeButton.setBackground(...);

 

 

 

Problem nastane, kdyz chci, aby tlacitko prestalo blikat. Tedy potrebuji

znovu nastavit vychozi UI. Nepomaha setBackground(null), znovupouziti setUI

a ani v prislusnem UI jsem nenasel zadnou funkci metodu, ktera by toho byla

schopna.

Odpovedet emailem