Pintando metade de uma JFrame

28 respostas
B

Pessoal gostaria de fazer com que a minha tela de pesquisa(feita em JFrame) ficasse metade cinza e metade branca, naum consegui nem deixar a JFrame toda branca, tentei o método setBackground, acho que tentei até o método paint tb, mas nada. Quero fazer isso porque quando a minha tabela está pequena fica um pedaço cinza embaixo que é o resto da Frame, mas eu quero que fique branco ao invés de cinza…

Já agradeço,

Raphael C.

(OBS: estou mandando mensagens seguidas porque estou numa LAN HOUSE e tenho que aproveitar o tempo.)

28 Respostas

Z

ae coloca 2 painéis
um vc deixa cinza e o outro branco…

B

vou tentar zackcavalera, valeu.

S

bigwaves, se você não quiser colocar 2 paineis… Coloca apenas 1, e desenha um retangulo ocupando todo o espaço de seu JFrame, utilizando o método paintComponent(Graphics) do JPanel

ao desenhar o retangulo vc pode definir para utilizar 2 cores, e onde vc quer que comece e termine cada cor.

Assim você consegue utilizar tudo em um JPanel…

se tiver entereçado em mais detalhes sobre isso… posta ae que posso por um exemplo…

B

sens, gostaria do exemplo sim, valeu cara.Ah aproveitando a deixa:

Vc leu akela minha mensagem que postei sobre : Acessar métodos de outra tela ?Ainda não consegui resolver…Se puder me ajudar , agradeço.Valeu sens.

S

bigwaves fiz um exemplo para vc tirar uma ideia…

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class painel2cores extends JFrame {
  painel2cores() {
   super("Painel de 2 cores");
   painel pane = new painel(this);
   setContentPane(pane);
   setSize(800,600);
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setVisible(true);
 }
  public static void main (String[] as) {
     JFrame frm= new painel2cores();

  }
}
class painel extends JPanel {
  JFrame frame;
   painel(JFrame frame) {
      this.frame = frame;
   }
   public void paintComponent(Graphics comp) {
      Graphics2D graf = (Graphics2D)comp;


      Dimension dim = frame.getSize();
      float wi = dim.width;
      float hei = dim.height;

      GradientPaint cor1 = new GradientPaint(wi/2,0,Color.yellow,wi,0,Color.green);
      //define as 2 cores que irao ser desenhadas. . .
      
      graf.setPaint(cor1);
      //seta como cor a ser desenhada...
      
      graf.fillRect(0,0,(int)wi,(int)hei);
     // desenha um retangulo do tamanho da tela com as cores que foram definidas..

   }

}

Não sei se isto irá ajudar… compila do jeito que tá e ve se é mais ou menos o que vc precisa. Os componentes no painel podem ser incluidos normalmente.

Talvez exista uma maneira mais fácil de fazer. Mas esta é a unica que me veio a cabeçã…

espero que ajude…

te mais

S

apenas mais um detalhe bigwaves…

vc irá notar que desta maneira que eu fiz as cores não irao mudar repentinamente, mas irão se misturando até ocorrer a troca das cores…

se vc quiser substituir as corres sem ocorrer esta mistura vc deve fazer assim…

GradientPaint cor1 = new GradientPaint(wi/2,0,Color.yellow,wi/2 +1,0,Color.green);

coloque esta linha no fonte que te mandei… (substituindo a outra claro)

valeu…

[]´s Victor

B

valeu sens, vou tentar.

R

nossa gostei bastante desse exemplo q deixas as cores em degrade, mas como faço para ao invez de estar na vertical as cores, quero colocar isso na horizontal e como posso manipular esses posicionamentos com mas facilidade.

agradeço se vc me ensinar como funciona…

S

Ricardosis, vamos lá… irei detalhar melhor para você então…

o argumento a ser chamado é este:

GradientPaint cor1 = new GradientPaint(int ,int, Color, int, int, Color);

com este argumento vc criará uma cor nova com este degrade que vc viu no código acima…

o “1° int” é o local em X que terminara a 1ª cor
o 2º int é o ponto em Y que terminara a 1ª cor
o 1º Color é qual será a primeira cor.
o 3º e 4º int é o ponto que teminará a “mistura da 2” e começara a segunda cor
e o 2º color é a segunda cor…

não sei se fui claro, mas vc seta o ponto onde termina a primeira cor, da um espaço que é a mistura, e deste ponto em diante soh terá a 2 cor…

pra vc fazer na horizontal, basta vc indicar o ponto 2 e 5 argumento com valores diferentes de zero e colocar os da 1 e 4 em zero. (o oposto do que fiz)

não sei se fui claro… mas deu pra entender melhor como funciona este método ???

[]'s Victor

B

sens, eu tentei encaixar na minha aplicação mas não consegui, o problema é esse:

A minha aplicação funciona em uma classe , ex: CadF.java, dentro desse CadF tem uma JDialog que é a própria tela do CadF, mas também tem uma outra JDialog, que é a tela de pesquisa, que só é acionada quando aperto um botão, o problema está aí:

Essa minha outra JDialog está dentro de um método e eu não posso transformar esse método pra uma classe, se não eu vou perder coisas que não posso perder e o problema é que não posso fazer um método herdar uma JFrame nem um JPanel.
Sens, vc saberia fazer o mesmo que vc fez, mas sem aquelas heranças do seu exemplo(extends JFrame e extends JPanel)?Porque não posso usar heranças…

R

Opa, gostei so não tava conseguindo mudar a posiçao e colocar na horizontal e agora deu para entender o que cada int faz.

obrigado

S

bigwaves, provavelmente o componente que você quer colocar 2 cores deve ter um métdodo “PaintComponent” ou um “paint”

o que vc precisa fazer eh assim : eh chamar esse método do seu componente e colocar encaixar o fonte que te dei la…

se vc quiser me mandar parte de seu fonte para eu ver se consigo mandae

[email removido]

se for pequeno manda aqui mesmo…

abraço…

[]'s Victor

B

sens, o componente que quero pintar é minha JDialog, vou colocar um exemplo bem simples do código pra vc ver:

private void Metodo()

{

JDialog jan=new JDialog(); //Essa é a janela que quero pintar

}

O problema é que não posso criar uma classe, tenho que usar esse método(por algumas razões, é melhor nem explicar, senão posso demorar) , vc saberia pintar essa JDialog?

S

bigwaves, eu nunca utilizei o JDialog, não sei se ele tem o metodo PaintComponent, mas eh bem provavel que sim…

se vc não pode criar um extends de JFrame oi JPanel que tal criar uma classe extends de JDialog???

e nesta classe vc utilizar o PaintComponent…

ai na hora de vc utilizar o JDialog vc utiliza normalmente, mas com o nome da nova classe que vc criou…

Acredito que isso não prejudicaria seu sistema, pois a nova classe se comportará da mesma forma …

isso não te ajudaria???

[]'s Victor

B

sens, vou tentar , não tinha pensado sobre dar um extends pra usar a outra JDialog, foi uma boa idéia, qualquer coisa eu retorno postando, valeu sens.

S

blz bigwaves, se conseguir postae… q agora eu fiquei curioso…

abraço e boa sorte…

B

sens, deu pra fazer, valeu msm pela ajuda, o negócio é que to precisando de uma outra ajuda importate msm cara, estou tentando fazer tela de relatório, tentei usar o Jasperreport e ireport, fiz minhas tabelas em database desktop e não consigo nem instalá-los(Jasperreport e ireport), keria saber se vc já teve experiência com eles, ou se já teve experiência em fazer tela de relatório pra poder me ajudar…

Ah sens, outra coisa: não consegui pintar a tela e mostrar os componentes ao msm tempo,ex: quero colocar um label na tela e pintá-la . Quando fiz isso a tela ficou pintada e o label não foi mostrado…

valeu pelas forças sens,

Raphael C.

B

ein sens, vc pode me autorizar no seu ICQ?

S

bigwaves, eu coloquei um JLabel naquele primeiro exemplo que eu postei acima e deu tudo certo. Teoricamente não devia estar escondendo porque quando usa o metodo paintComponente ele desenha como plano de fundo no painel onde esta sendo desenhado. Por isso os componentes que vc inclui devem sobrepor o desenho .

Por acaso o JLabel não esta da mesma cor que o fundo que vc pintou? tenta adicionar outros componentes para teste e ve o que acontece… Sinceramente não sei por que isso esta acontecendo.

Quanto ao ICQ, pede autorização denovo OK? vc não tem MSN? eu uso com mais frequencia que o icq, mas de qualquer forma pede autorização denovo…

valeu…

[]'s Victor

B

ein sens , eu vou tentar , qualquer coisa eu te falo entaum, valeu sens.

R

sens tudo bem, vc me ajudou bastante entendi bem como usar um degrade para um JPanel. so q minha duvida agora é como posso atribuir esse degrade para um botão ou um outro qualquer componente
Aqui esta um codigo se vc pudesse implementar isso eu tomarei como exemplo

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class teste extends JFrame {
	private JButton bAbrir,bSalvar;
	private ButtonGroup bg;
	private JRadioButton fixa,celular;
	
	public teste(){
		super("Teste");
   		painel pane = new painel(this); 
   		setContentPane(pane);
   		setLayout(null); 
		setBounds(100,100,328,175);
		setResizable(false);
		
		bAbrir=new JButton();
		bAbrir.setBounds(30,30,45,35);
		pane.add(bAbrir);
		
		bSalvar=new JButton();
		bSalvar.setBounds(85,30,45,35);
		pane.add(bSalvar);
		
		fixa=new JRadioButton();
		fixa.setBounds(165,40,20,20);
		pane.add(fixa);
		
		celular=new JRadioButton();
		celular.setBounds(165,60,20,20);
		pane.add(celular);
		
		bg=new ButtonGroup();
		bg.add(fixa);
		bg.add(celular);
			
		setVisible(true);
	}
	public static void main(String args[]){
		JFrame dp=new teste();
	}
}
	class painel extends JPanel { 
  	JFrame frame; 
  	painel(JFrame frame) { 
    this.frame = frame; 
   	} 
	public void paintComponent(Graphics comp) { 
    Graphics2D graf = (Graphics2D)comp; 

    Dimension dim = frame.getSize(); 
    float wi = dim.width; 
    float hei = dim.height; 

    GradientPaint cor1 = new GradientPaint(0,wi/8,new Color(253,253,253),0,wi/4,new Color(204,206,217));
       graf.setPaint(cor1); 
      graf.fillRect(0,0,(int)wi,(int)hei); 
       }
}

Obrigado fico aguardando

B

sens, descobri o problema, porém não consegui resolvê-lo, acho que vc pode conseguir:

Eu tenho que conseguir fazer o mesmo que vc fez, só que com apenas uma classe, no seu exemplo eram duas classes(uma herdava JFrame e outra JPanel) no meu sistema só poderei fazer uma classe, será que vc conseguiria? Eu tentei o paintcomponent, mas não deu , porque na hora de chamá-lo ele não pode ser chamado, pelo que testei, tentei o paint tb, mas ele pinta tudo e some com o label ou qualquer outro componente…

S

bigwaves, será necessário criar uma classe nova para aquele componente que vc quer pintar, pois o método paintComponent é chamado internamente pelo componente quando ele é desenhado. E para poder incluir algo ali é necessário criar usa subclasse deste componente.

Não consigo entender o que lhe impede de criar uma outra classe do componente que vc quer pintar, vc já deixou claro que não quer uma classe nova mas isso é realmente necessário? vc pode dizer seus motivos??

bigwaves me inclui de novo no ICQ 35364691

abraço…

S

Ricardosis

se der tempo eu analizo seu código e faço um exemplo hj a noite pra vc… Não garanto que faço isto hj pq estou um pouco enrolado aqui no trampo, mas assim que der dou uma olhada…

abraço…

B

ein sens, não posso colocar duas classes porcausa disso:

Eu tenho somente em um arquivo duas telas(JDialog):Uma pra cadastro de conserto e outra pra consulta de máquina(é um exemplo).Então , quando estou na tela de consulta de máquina e realizo algumas ações a tela de cadastro de conserto muda ,então por isso não posso fazer o lance de duas classes,porque se eu fosse chamar uma outra classe eu não poderia fazer essa variação de uma tela pra outra ao msm tempo, tentei de várias vezes mas não deu.Então usando só uma classe não tem como né sens? Acho que já posso ir desistindo :cry: , mas valeu pela força cara,

Raphael C.

S

Ricardosis, fiz um exemplo (aproveitando o seu) de como fazer para pintar um JButton. Neste exemplo a escrita do botão não aparece, pois ela também é um desenho e a pintura sobrepoe a escrita. Para fazer a escreita deve-se usar o metodo drawString, do proprio Graphics.

mas acho que desta maneira já da pra vc tirar uma ideia.

Apenas para lembrar, a maioria dos componentes Swing possui um método paintComponent, desta forma é possivel fazer isto com quase todos os componentes.

resumindo…

apenas crie uma subclasse daquela que vc quer pintar, e utilize o metodo paintComponent.

segue o código

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class teste extends JFrame {
   private JButton bAbrir,bSalvar;
   private ButtonGroup bg;
   private JRadioButton fixa,celular;
   
   public teste(){
      super("Teste");
         painel pane = new painel(this);
         setContentPane(pane);
         setLayout(null);
      setBounds(100,100,328,175);
    //  setResizable(false);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      bAbrir=new NovoBotao();
      bAbrir.setBounds(30,30,45,35);
      pane.add(bAbrir);
      
      bSalvar=new NovoBotao();
      bSalvar.setBounds(85,30,45,35);
      pane.add(bSalvar);
      
      fixa=new JRadioButton();
      fixa.setBounds(165,40,20,20);
      pane.add(fixa);
      
      celular=new JRadioButton();
      celular.setBounds(165,60,20,20);
      pane.add(celular);
      
      bg=new ButtonGroup();
      bg.add(fixa);
      bg.add(celular);
         
      setVisible(true);
   }
   public static void main(String args[]){
      JFrame dp=new teste();
   }
}
   class painel extends JPanel {
   
     JFrame frame;
     painel(JFrame frame) {
    this.frame = frame;
      }
   public void paintComponent(Graphics comp) {
    Graphics2D graf = (Graphics2D)comp;

    Dimension dim = frame.getSize();
    float wi = dim.width;
    float hei = dim.height;

    GradientPaint cor1 = new GradientPaint(0,wi/8,new Color(253,253,253),0,wi/4,new Color(204,206,217));
       graf.setPaint(cor1);
      graf.fillRect(0,0,(int)wi,(int)hei);
       }
} 

   class NovoBotao extends JButton {

      public void paintComponent(Graphics comp) {
         Graphics2D graf = (Graphics2D)comp;
	 
	 Dimension dim = this.getSize();
	 float wi = dim.width;
	 float hei = dim.height;
	 
	 GradientPaint cor1 = new GradientPaint(0,wi/8,Color.green,0,wi/4,Color.yellow);
	 graf.setPaint(cor1);
	 graf.fillRect(0,0,(int)wi,(int)hei);
      }
   }
S

bigwaves, realmente acho que não é possível fazer sem criar um nova classe. talvez até exista uma maneira, mas eu acho dificil…

Talvez se vc tentar mais um pouco consiga utilzar mais classes no seu projéto, acho que seria mais facil vc conseguir isto do que fazer a pintura sem implementar uma subclasse.

se precisar de alguma coisa da um toke velho… boa sorte…

abraço

victor…

B

valeu sens, mas msm assim agradeço.

Criado 25 de janeiro de 2005
Ultima resposta 17 de fev. de 2005
Respostas 28
Participantes 4