• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Sign in to follow this  
Followers 0
ms2222

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

15 posts in this topic

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.

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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:

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

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");

 }
}

Edited by Rui Carlos
GeSHi
0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

É 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?

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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:

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);
   }
}

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;
 }

}

Edited by Rui Carlos
GeSHi
0

Share this post


Link to post
Share on other sites

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.

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.

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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:

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();
	}
};


}

Edited by Rui Carlos
GeSHi
0

Share this post


Link to post
Share on other sites

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

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.

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

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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 ;)

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0