Pergunta

Estou desenvolvendo um aplicativo Java Desktop. Nele eu tenho 4 JButtons com um JPanel. Agora eu quero que, sempre que um botão for clicado em sua cor de fundo mude para outra cor (digamos laranja) para representar que ele foi clicado e a cor de fundo de todos os outros 3 botões é redefinida para sua cor padrão (caso algum deles tivesse laranja cor de fundo).

Portanto, apenas um botão pode ter a cor laranja.

A abordagem atual que apliquei é que implementei o seguinte código no xxxActionPerformed() Método de JButton Button1

button1.setBackground(Color.Orange);
button2.setBackground(Color.Gray);
button3.setBackground(Color.Gray);
button4.setBackground(Color.Gray);

e da mesma forma para os demais três botões.

Agora, na verdade, não quero a cor do backgroud como cinza (para o botão não picado). Em vez disso, quero a cor do fundo padrão para que a cor do backgroud se ajuste à aparência e sensação da GUI de acordo com a aparência e a sensação da plataforma do usuário final.

Q1. Como posso obter a cor de fundo padrão?

Q2. Essa é a abordagem correta para fazer isso ou existe algum outro mecanismo através do qual eu possa agrupar todos os quatro botões em um grupo de botões para que apenas um possa ter a propriedade especificada ao mesmo tempo (como botões de rádio)?

Foi útil?

Solução

  1. Apenas use null Para usar a cor padrão:

    button1.setBackground(Color.ORANGE);
    button2.setBackground(null);
    ...
    
  2. Considere usar o JTOGGLEBUTTONS com um buttongRoup, defina o ícone e pressiona os botões. Não há necessidade de alterar a cor do fundo.

    button1 = new JToggleButton(new ImageIcon("0.jpg"));
    button1.setSelectedIcon(new ImageIcon("1.jpg"));
    button2 = new JToggleButton(new ImageIcon("0.jpg"));
    button2.setSelectedIcon(new ImageIcon("2.jpg"));
    ...
    ButtonGroup group = new ButtonGroup();
    group.add(button1);
    group.add(button2);
    ...
    

Outras dicas

Você pode obter a cor de fundo padrão para botões do Uimanager:

button1.setBackground(UIManager.getColor("Button.background"));

Até onde eu sei, as chaves podem mudar em aparência e sensação diferentes. Aqui está um bom aplicativo Webstart que mostra todas as teclas disponíveis:

http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/

Aqui está uma seção transversal de "Button.background" com base nisso exemplo:

*** Metal javax.swing.plaf.metal.MetalLookAndFeel 636 entries
Button.background: javax.swing.plaf.ColorUIResource[r=238,g=238,b=238]

*** Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel 1052 entries
Button.background: com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel$NimbusProperty@60961dff

*** CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel 550 entries
Button.background: javax.swing.plaf.ColorUIResource[r=174,g=178,b=195]

*** Mac OS X com.apple.laf.AquaLookAndFeel 705 entries
Button.background: com.apple.laf.AquaNativeResources$CColorPaintUIResource[r=238,g=238,b=238]

Q1.: Para obter a cor da GUI do botão, basta fazer isso

button1.setBackground(Color.Orange);
button2.setBackground(java.awt.SystemColor.control);
button3.setBackground(java.awt.SystemColor.control);
button4.setBackground(java.awt.SystemColor.control);

Com esta classe (java.awt.systemcolor.*), Você pode obter a cor de todos os elementos da sua interface do usuário.

Q2.: Eu nunca ouvi falar de agrupar botões. Então, eu não posso responder a você este.

Espero que ajude.

Se desejar, poderá redesenhar seu botão inteiro

public class buttonUI extends javax.swing.plaf.basic.BasicButtonUI{

buttonUI(JButton b){
    b.setContentAreaFilled(false);
}

@Override
    public void paint(Graphics g,JComponent c){
             Graphics2D g2d = (Graphics2D) g;
             g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
             AbstractButton b = (AbstractButton) c;
             g2d.setFont(font.deriveFont(11f));
             Dimension d = b.getSize();
             FontMetrics fm = g2d.getFontMetrics();
             g2d.setColor(new Color(100,100,100));
             String caption = b.getText();
             int x = (d.width - fm.stringWidth(caption)) / 2;
             int y = (d.height + fm.getAscent()) / 2 - 2;
             g2d.drawString(caption, x, y);        
        }   }

e em sua parte principal de uso de código como

jButton1.setUI(new buttonUI(jButton1));

É assim que eu o uso .. você pode ter o seu próprio caminho também

Você analisou o padrão do decorador em Java, você passa um botão em um método que o decora, dependendo se o botão é o ativo atual, por exemplo, se ele pairava.

public Jbutton decorateButton(JButton b, boolean isHoveredOver){
    if(isHoveredOver)
        b.setBackground(getContentPane().getBackground().GREEN);
    return b;
}

Você chama esse método dos métodos Mouseevent ou ActionEvent e apenas emite um repount () depois. Coloque todos os seus botões em uma matriz ou vetor e percorra -o, passando cada um para o método decorado, e forneça o valor booleano do Inícioil do False e, no evento, o defina como true. Dessa forma, o valor inicial é padrão e o botão é decorado após a ação, os botões parecem estar agindo como parte de um grupo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top