Ir para conteúdo


Revista PROGRAMAR – Edição 46 (Setembro 2014): Download já disponível!

- - - - -

Mudar o aspecto de um botão? (cor,forma)


  • Por favor inicie sessão para responder
14 respostas a este tópico

#1 ms2222

ms2222

    void

  • Membro
  • PipPip
  • 39 mensagens

Publicado 10 de Abril de 2010 - 15:36

Boas...
Gostaria de saber se em java é possivel personalizar um botão. Por exemplo, eu queria um botão rectangular com os cantos arredondados de cor azul com a linha de contorno num preto mais carregado. É possível fazer isto? Já andei a ver na api mas não percebo muito daquilo. Alguém tem exemplos de código para estas opções?
Obrigado.

#2 Knitter

Knitter

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 6135 mensagens

Publicado 10 de Abril de 2010 - 16:11

Não tenho exemplo nenhum de como fazer isso, mas será fácil de encontrar se procurares no google por "create java look and feel" e por "java synth look and feel".

Em Java, alterar o aspecto de um botão pode ser feito de muitas maneiras:
  • podes implementar o teu próprio botão;
  • podes alterar os métodos de desenho de um botão;
  • podes implementar parte de um look and feel para os botões
  • podes usar o novo look and feel, o synth, e usar skins para definir o aspecto

A forma  a usar depende do projecto e do que pretendes fazer, mas talvez possas tentar ver o synth look and feel.

#3 ms2222

ms2222

    void

  • Membro
  • PipPip
  • 39 mensagens

Publicado 11 de Abril de 2010 - 12:02

Já consegui fazer um botão mais ou menos como eu queria, contudo crio uma classe para criar o botão, mas quando chamo o metodo "criarbotao" na classe principal no applet o botão não aparece. O que estou a fazer mal? Se calhar é uma coisa simples, mas como eu sou iniciante em java não estou a perceber o problema.
Em baixo apresento o código. O que estou a tentar fazer é o jogo da forca, mas assim não está fácil. Se me puderem ajudar agradeço.

Classe principal:
Código (Java):
import java.applet.*;


public class Forca extends Applet{

    public void init(){

        Botoes CriarBotoes = new Botoes();

        CriarBotoes.criarbotao(); // Aqui queria chamar o método para criar o botão

    }
}

Classe criar botão

Código (Java):
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;


public class Botoes extends JFrame{

    public void criarbotao(){

        JButton botao = new JButton();

        botao.setFont(new Font("Ravie", 1, 18));
        botao.setForeground(new Color(0, 0, 102));
        botao.setText(" A ");
        botao.setBorder(javax.swing.BorderFactory.createLineBorder(new Color(0, 0, 102), 3));
        botao.setRequestFocusEnabled(false);
        botao.setRolloverEnabled(false);
        botao.setMargin(new Insets(2, 1000, 2, 14));
        add(botao);
        System.out.printf("teste");

  }
}

Editado por Rui Carlos, 22 de Janeiro de 2014 - 20:27.
GeSHi


#4 Knitter

Knitter

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 6135 mensagens

Publicado 11 de Abril de 2010 - 12:54

Não adicionaste qualquer painel à JFrame nem estás a adicionar o botão ao painel base da JFrame, além disso não tens qualquer layout aplicado à JFrame.... espera, se estás a fazer applets para que estás a usar uma JFrame? E neste caso estás a criar os botões numa JFrame que nem está visível.

O código do botão está correcto, mas precisas de o adicionar ao elemento que está visível, pelo código que colocaste não estás a tornar a JFrame visível, além disso, se estás a usar Applets, então é na Applet que tens de adicionar o botão.

#5 ms2222

ms2222

    void

  • Membro
  • PipPip
  • 39 mensagens

Publicado 11 de Abril de 2010 - 13:30

É pah agora confundiste-me um bocado. Então deixa-me cá ver...Eu se colocar o código de criar botão directamente no applet o botão é criado normalmente, mas e se eu quiser criar um botão numa classe, qual então a melhor forma de o fazer?

#6 Knitter

Knitter

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 6135 mensagens

Publicado 11 de Abril de 2010 - 22:01

Não é o código do botão directamente na applet, mas um componente visual, para se tornar visível, tem de ser adicionado a um dos componentes de topo e neste caso será a applet. O método add() que estás invocar para adicionar o botão à JFrame, está a fazer add de um botão a um elemento que não está visível. Pelo menos é isso que parece com o código que colocaste.

#7 ms2222

ms2222

    void

  • Membro
  • PipPip
  • 39 mensagens

Publicado 11 de Abril de 2010 - 23:30

Ok, acho que já resolvi o problema do botão. o que eu fiz foi criar um metodo que retornasse uma variável do tipo JButton que posteriormente vai ser aplicada ao add na classe principal.
Contudo agora surgiu-me outro problema, coloquei uma imagem como imagem de fundo, contudo esta imagem sobrepõe-se e tapa-me o botão  :wallbash:
Como é que eu agora ponho os botões e os restantes componentes que pretendo adicionar por cima da imagem de fundo?

O código actualmente encontra-se assim:

Código (Java):
import java.applet.*;
import java.awt.Graphics;
import java.awt.Image;

public class Forca extends Applet{

    private Image ImagemFundo;
    Botoes CriarBotoes = new Botoes();

    public void init(){
        resize(660,370);
       
        add(CriarBotoes.criarbotao());
        ImagemFundo = getImage(getDocumentBase(),"Fundo.png");
    }

    public void paint(Graphics g){
        super.paint(g);
        g.drawImage(ImagemFundo,0,0,this);
    }
}

Código (Java):
import java.awt.*;
import javax.swing.*;

public class Botoes{

JButton botao = new JButton();

    public JButton criarbotao(){

    botao.setFont(new Font("Ravie", 1, 18));
    botao.setForeground(new Color(0, 0, 102));
    botao.setText(" A ");
    botao.setBorder(javax.swing.BorderFactory.createLineBorder(new Color(0, 0, 102), 3));
    botao.setRequestFocusEnabled(false);
    botao.setRolloverEnabled(false);
    botao.setMargin(new Insets(2, 1000, 2, 14));

    return botao;
  }

}

Editado por Rui Carlos, 22 de Janeiro de 2014 - 20:27.
GeSHi


#8 Knitter

Knitter

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 6135 mensagens

Publicado 12 de Abril de 2010 - 08:59

Ver Mensagemms2222, em 11 de Abril de 2010 - 23:30, disse:

Ok, acho que já resolvi o problema do botão. o que eu fiz foi criar um metodo que retornasse uma variável do tipo JButton que posteriormente vai ser aplicada ao add na classe principal.
Resolve o problema, assim tens o botão no elemento visível.

Ver Mensagemms2222, em 11 de Abril de 2010 - 23:30, disse:

Contudo agora surgiu-me outro problema, coloquei uma imagem como imagem de fundo, contudo esta imagem sobrepõe-se e tapa-me o botão
Troca a ordem das linhas que tens, desenha a imagem antes de invocares o super.paint(g). Convém colocares o fundo da Applet como não opaco, setOpaque(false), para que a imagem apareça.

Como nota, o teu código funciona mas está um pouco confuso e algo desorganizado. Não faz sentido teres uma classe só para criar os botões, podes ter o método que cria os componentes gráficos dentro da classe que representa a tua applet. A classe Botoes é inútil.

#9 ms2222

ms2222

    void

  • Membro
  • PipPip
  • 39 mensagens

Publicado 15 de Abril de 2010 - 11:22

Tinhas razão, trocando a ordem das linhas a imagem já aparece.  :thumbsup:
Já agora, e não querendo abusar tenho mais uma questão, no final a aplicação irá ter que correr como applet e stand-alone, é necessário alguns cuidados na programação do apple para depois correr como stand alone?

#10 Knitter

Knitter

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 6135 mensagens

Publicado 15 de Abril de 2010 - 11:26

As Applets não correm em stand-alone, correm sempre dentro de um browser, pelo menos na sua forma normal. Se queres uma aplicação desktop tens de fazer uma, isso implica refazer a interface para deixar de usar Applet e passar a usar JFrame, ou passares tudo para JavaFX e assim teres apenas uma aplicação.

O melhor é mesmo teres duas versões, uma Applet e uma versão desktop.

#11 ms2222

ms2222

    void

  • Membro
  • PipPip
  • 39 mensagens

Publicado 25 de Abril de 2010 - 22:50

Bem, cá estou eu mais uma vez, com mais uma dúvida. Como não tive tempo para fazer as duas versões, uma para applet e outra para desktop, acrescentei uma classe que cria um frame para executar o programa em stand-alone. Tudo funciona bem, com excepção da imagem de fundo, que tapa os componentes do jogo. A minha questão é de como ponho a label que contem a imagem, em background, com as strings e componentes em cima desta.
Obrigado...
Deixo em baixo o código do frame:

Código (Java):
import java.awt.*;
import java.net.*;
import java.applet.*;
import javax.swing.* ;
import java.awt.event.*;

public class ForcaFrame extends JFrame{

    GraphicsConfiguration gc = null;
        Rectangle bounds = null;
        ClassLoader cl = null;
        JLabel tela = null;

        public ForcaFrame(String titulo) {
                super(titulo);
                gc = this.getGraphicsConfiguration();
                bounds = gc.getBounds();
                cl = getClass().getClassLoader();
                setLocation(200 + bounds.x, 200 + bounds.y);
                tela = new JLabel(new ImageIcon(cl.getResource("Fundo.png")));
                setBackground(Color.black);
                //getContentPane().add(tela);
                setSize(670,350);
                setResizable(false);
                setVisible(true);
                addWindowListener(new EscutaJanela());

        }

        class EscutaJanela extends WindowAdapter
        {

                public void windowClosing(WindowEvent e) {
                        setVisible(true);
                        dispose();
                }
        };


}

Editado por Rui Carlos, 22 de Janeiro de 2014 - 20:28.
GeSHi


#12 Pontus

Pontus

    void

  • Membro
  • PipPip
  • 77 mensagens

Publicado 26 de Abril de 2010 - 14:52

Boas. O Knitter tem no wiki um exemplo para o que estás a pedir

#13 Telma_mmf

Telma_mmf

    null

  • Novo Membro
  • Pip
  • 2 mensagens

Publicado 09 de Junho de 2010 - 09:03

Olá

No meu projecto, eu fiz botões para definir as casas de um jogo, tal como o jogo da glória, mas preciso de por mesmo imagens nos botões em certas casas. Como faço isso? Já tentei mil e uma maneiras mas não consigo   :D

Código (Java™ 2 Platform Standard Edition 5.0):
 public void hideSquare(JPanel panel, JButton[] tabuleiro, int casaPos){
        tabuleiro[casaPos] = new JButton();
        tabuleiro[casaPos].setBackground(Color.gray);
        panel.add(tabuleiro[casaPos]);
        tabuleiro[casaPos].setEnabled(false);        
    }
Foi este o método que usei para criar os botões e atribuir-lhes uma cor, que também precisava.

Código (Java™ 2 Platform Standard Edition 5.0):
public void criaTabuleiro(){
        for(int i=0; i<143;i++){
              if(i==8){
                hideSquare(jPanel1, tabuleiro, 25);
            }
Aqui foi onde eu defini os números das casas. o que está dentro da condição é a quadricula onde está a casa, o 25 é a posição do botão no tabuleiro de jogo.

Obrigada

#14 Baderous

Baderous

    Unsigned User

  • Moderador
  • PipPipPipPipPipPip
  • 2673 mensagens

Publicado 09 de Junho de 2010 - 10:34

Para meteres uma imagem num JButton, podes usar 2 formas: o seu construtor que recebe um Icon como parâmetro ou usar o método setIcon depois de o teres criado. Podes usar a classe ImageIcon que implementa a interface Icon para obteres a imagem e depois passas a instância dessa classe usada ao construtor ou ao método que referi.

#15 Telma_mmf

Telma_mmf

    null

  • Novo Membro
  • Pip
  • 2 mensagens

Publicado 15 de Junho de 2010 - 20:08

Ver MensagemBaderous, em 09 de Junho de 2010 - 10:34, disse:

Para meteres uma imagem num JButton, podes usar 2 formas: o seu construtor que recebe um Icon como parâmetro ou usar o método setIcon depois de o teres criado. Podes usar a classe ImageIcon que implementa a interface Icon para obteres a imagem e depois passas a instância dessa classe usada ao construtor ou ao método que referi.

De facto, já tentei dessa forma, mas não deu resultado  :P

Só consigo é com JLabel's...que é só mudar nas propriedades. Mas com botões não consigo.

Mas obrigada na mesma ;)