Problema ao atribuir valor de textfield

11 respostas
Y

Pessoal, to tentando pegar um valor de textfield, converte-lo para double e por em uma variavel. Entao usar essa variavel pra informar o valor de um Retangulo de outra classe.

Só que tudo que ta saindo na tela, nao importando o que eu digito de valor, é simplesmente um ponto branco no meio da tela. Aqui o código:

public class Wallpaper extends JFrame {

double colunaRV = 0,comprimentoRV = 130,linhaRV = 0,larguraRV = 80,colunaEV = 0,comprimentoEV = 130,linhaEV = 0,larguraEV = 80,colunaLV = 0,comprimentoLV = 130,linhaLV = 0,larguraLV = 80;

public Wallpaper() { //Frame
    
setTitle("Wallpapers");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);
    setSize(1024, 700);
    Container tela = getContentPane();
    setLayout(null);
    setLocationRelativeTo(null);

               //Textfield
    //Retangulo
    colunaRetangulo = new JTextField("");
    colunaRetangulo.setBounds(300,90,50,20);
    colunaRetangulo.setVisible(true);

    linhaRetangulo = new JTextField("");
    linhaRetangulo.setBounds(400,90,50,20);
    linhaRetangulo.setVisible(true);

    larguraRetangulo = new JTextField("");
    larguraRetangulo.setBounds(500,90,50,20);
    larguraRetangulo.setVisible(true); 

    comprimentoRetangulo = new JTextField("");
    comprimentoRetangulo.setBounds(600,90,50,20);
    comprimentoRetangulo.setVisible(true);

    //Elipse
    colunaElipse = new JTextField("");
    colunaElipse.setBounds(300,180,50,20);
    colunaElipse.setVisible(true);

    linhaElipse = new JTextField("");
    linhaElipse.setBounds(400,180,50,20);
    linhaElipse.setVisible(true);

    larguraElipse = new JTextField("");
    larguraElipse.setBounds(500,180,50,20);
    larguraElipse.setVisible(true);  

    comprimentoElipse = new JTextField("");
    comprimentoElipse.setBounds(600,180,50,20);
    comprimentoElipse.setVisible(true);

    //Linha
    colunaLinha = new JTextField("");
    colunaLinha.setBounds(300,270,50,20);
    colunaLinha.setVisible(true);

    linhaLinha = new JTextField("");
    linhaLinha.setBounds(400,270,50,20);
    linhaLinha.setVisible(true);

    larguraLinha = new JTextField("");
    larguraLinha.setBounds(500,270,50,20);
    larguraLinha.setVisible(true);

    comprimentoLinha = new JTextField("");
    comprimentoLinha.setBounds(600,270,50,20);
    comprimentoLinha.setVisible(true);

    // Aleatorio
    cordefundo = new JTextField("Cor de Fundo");
    cordefundo.setBounds(50, 230, 60, 20);
    cordefundo.setVisible(true);
 
    //Retangulo
    tela.add(colunaRetangulo);
    tela.add(linhaRetangulo);
    tela.add(comprimentoRetangulo);
    tela.add(larguraRetangulo);

     //Elipse
    tela.add(colunaElipse);
    tela.add(linhaElipse);
    tela.add(comprimentoElipse);
    tela.add(larguraElipse);

    //Linha
    tela.add(colunaLinha);
    tela.add(linhaLinha);
    tela.add(comprimentoLinha);
    tela.add(larguraLinha);

    setVisible(true);

    botao1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            if (retangulo.isSelected() == true && elipse.isSelected() == true && linha.isSelected() == true && girar.isSelected() == false){
                    colunaRV = Double.parseDouble(colunaRetangulo.getText());
                    linhaRV = Double.parseDouble(linhaRetangulo.getText());
                    larguraRV = Double.parseDouble(larguraRetangulo.getText());
                    comprimentoRV = Double.parseDouble(comprimentoRetangulo.getText());

                    colunaEV = Double.parseDouble(colunaElipse.getText());
                    linhaEV = Double.parseDouble(linhaElipse.getText());
                    larguraEV = Double.parseDouble(larguraElipse.getText());
                    comprimentoEV = Double.parseDouble(comprimentoElipse.getText());

                    colunaLV = Double.parseDouble(colunaLinha.getText());
                    linhaLV = Double.parseDouble(linhaLinha.getText());
                    larguraLV = Double.parseDouble(larguraLinha.getText());
                    comprimentoLV = Double.parseDouble(comprimentoLinha.getText());
                RELJFrame jframeREL = new RELJFrame();
                jframeREL.setVisible(true);                 
                
            } else if (retangulo.isSelected() == true && elipse.isSelected() == true && linha.isSelected() == false)
                {
                    REJFrame jframeRE = new REJFrame();
                    jframeRE.setVisible(true);
                } else if (retangulo.isSelected() == true && elipse.isSelected() == false && linha.isSelected() == true){
                    RLJFrame jframeRL = new RLJFrame();
                    jframeRL.setVisible(true);
                } else if (retangulo.isSelected() == false && elipse.isSelected() == true && linha.isSelected() == true){
                    ELJFrame jframeEL = new ELJFrame();
                    jframeEL.setVisible(true);
                }
              }
            
        }

Essa é a classe principal, Wallpaper.

Essa é onde aparece o desenho:

public class REL extends JPanel {
    Wallpaper jframeWallpaper = new Wallpaper();

    public Rectangle2D r(){
        return new Rectangle2D.Double(jframeWallpaper.colunaRV,jframeWallpaper.linhaRV,jframeWallpaper.larguraRV,jframeWallpaper.comprimentoRV);
    }
    public Line2D l(){
        return new Line2D.Double(jframeWallpaper.colunaLV,jframeWallpaper.linhaLV,jframeWallpaper.larguraLV,jframeWallpaper.comprimentoLV);
    }
    public Ellipse2D e(){
        return new Ellipse2D.Double(jframeWallpaper.colunaEV,jframeWallpaper.linhaEV,jframeWallpaper.larguraEV,jframeWallpaper.comprimentoEV);
    }


AffineTransform at =
         AffineTransform.getTranslateInstance(w / 2, h / 2);
         g.draw(at.createTransformedShape(l()));
         g.draw(at.createTransformedShape(r()));
         g.draw(at.createTransformedShape(e()));

O que ta acontecendo? D:

11 Respostas

Y
Yakkut:
Pessoal, to tentando pegar um valor de textfield, converte-lo para double e por em uma variavel. Entao usar essa variavel pra informar o valor de um Retangulo de outra classe.

Só que tudo que ta saindo na tela, nao importando o que eu digito de valor, é simplesmente um ponto branco no meio da tela. Aqui o código:

public class Wallpaper extends JFrame {

double colunaRV = 0,comprimentoRV = 130,linhaRV = 0,larguraRV = 80,colunaEV = 0,comprimentoEV = 130,linhaEV = 0,larguraEV = 80,colunaLV = 0,comprimentoLV = 130,linhaLV = 0,larguraLV = 80;

Eu iniciei as variaveis com esses valores, e desenhou algo na tela, mas ainda nao ta recebendo os valores dos textfields. Alguem sabe o que esta acontecendo?

R

nao entendi muito bem o que vc queria

faz um ajuste ae e testa: tira todos os setvisible(true) do seu código exceto aqueles dentro da ActionListener

então inclua 1 unico desses la embaixo, depois de terminar seu addActionListener no botão 1…

e abaixo do:

jframeREL.setVisible(true); e do
jframeEL.setVisible(true);

coloca um:

repaint();

veja no que da…
nao entendi direito seu problema e tal mas isso pode resolver talvez…

Y

Nao funcionou…
Deixa eu explicar:

Quando voce clica no botao1, voce muda pra um jpanel que deveria mostrar as figuras de um certo modo (especificado pelos valores nos textfields).
Só que nao esta mostrando as figuras da forma correta, esta simplesmente desenhando um ponto branco no meio da tela quando muda pro jpanel.
Quero saber o porque e como corrigir…

R

o que tem na classe REJFrame e ELJFrame ? é um painel?

Y

É assim:

a classe REL é um jpanel, a classe RELJFrame é o JFrame desse panel. Entendeu?
É assim com as outras:
RE e REJFrame
EL e ELJFrame

REL quer dizer Retangulo, Elipse e Linha, as figuras basicas que eu uso pra desenhar outras.

EL quer dizer Elipse e Linha…etc…

R

então nessa linha

REJFrame jframeRE = new REJFrame();

vc criou o painel e depois pediu pra ele ficar visivel… eh isso? onde vc adiciona esse painel ao frame?

kra… o que for painel, coloca o nome de REpainel… algo assim… vc ta confundindo tudo…

vc tem q criar 1 unico frame que é seu JFrame ( ou uma classe que extende ele, no caso seu wallpaper ) e quantos paineis vc quiser ( classes extendendo JPanel )

dae vc tem q adicionar esses paineis ao seu frame… vc ta fazendo isso onde? ou nao ta? ou o frame q vc ta adicionando isso nao eh o wallpaper?

Y

Eu to criando um JFrame para cada painel…Isso não é necessario? Eu posso por os painels no JFrame principal?
Bom, mas alguem sabe o porque que as variaveis nao estao recebendo os valores dos textfields?

R

rapaz… talvez os outros fontes q vc nao colocou tenha algumas coisas ae e eu posso estar enganado…

mas saca soh o q vc ta fazendo:

  1. primeiro vc cria a classe JFrame Wallpaper com os campos… como vc disse, é sua classe principal

  2. vc cria o listener nessa classe

  3. no listener vc cria um JFrame pra exibição do desenho

  4. dentro desse JFrame criado, que possui o painel, vc cria outro wallpaper

public class REL extends JPanel { Wallpaper jframeWallpaper = new Wallpaper();

notou alguma coisa errada?

sugestão:

  • cria só 1 frame, o principal
  • coloca seus campos nele
  • coloca TODOS os paineis que vc criou nesse frame principal e esquece os outros frames
  • coloca todos os paineis como setVisible( false );
  • cria um metodo nos paineis que recebe os valores dos campos digitados no principal
  • ao clicar no principal ele manda os valores pro painel, que faz o desenho e adiciona o desenho ao painel
  • esse painel então fica visivel

algo desse tipo:

public class Wallpaper extends JFrame implements ActionListener {  

JTextField colunaRetangulo = new JTextField("");  
JTextField linhaRetangulo    = new JTextField("");  
... // outros campos inclusive os paineis
JPanel painel1 = new JPanel();
...
...

  
public Wallpaper() { //Frame  
      
    setTitle("Wallpapers");  
    setDefaultCloseOperation(EXIT_ON_CLOSE);  
    setResizable(false);  
    setSize(1024, 700);  
    Container tela = getContentPane();  
    setLayout(null);  
    setLocationRelativeTo(null);
..
    // configura seus campos e  paineis
    linhaRetangulo.setBounds(400,90,50,20);  
    painel1.setBounds ( x,x,x,x );
..
..
    // adiciona campos no frame - ideal seria adicionar num painel mas tudo bem
    getContentPane().add( linhaRetangulo );
..

// bem resumido... vc deveria verificar se ja tem painel true e tal...
public void actionPerformed(ActionEvent e){  
   
   if ( e.getSource == seuBotao ) {
      // verifica os selecionados e captura os textos como vc fez
      // depois envia para o painel
      painelX.setDesenho( medidas do desenho );
      painel.setVisible(true);
   }
Y

Como eu vou deixar um panel visivel sendo que o JFrame que ele se encontra esta cheio de componentes?

Eu nao entendi como vou deixa-los visiveis. Por isso eu tinha um JFrame pra cada JPanel.

Caso seja necessario eu posto mais alguma parte do código, mais eu acredito que o necessario esta a mostra.

Mas o que eu queria saber mesmo, é porque que essas variaveis nao estao atribuindo o valor ao retangulo e a linha e a elipse.

R

rapaz… ninguem ta te ajudando não é pq nao sabem… eh pq o codigo q vc colocou eh limitado… eu nao fazia ideia q tinha outros componentes nos outros frames… agora q to fazendo uma ideia do seu programa…

vc podia ter colocado 1 dos outros frames pra ver como ta pq ao meu ver o problema ta no que eu ja te disse:

Y

Vamos la, mais uma vez.

Ainda nao conseguir resolver meu problema. Vou postar uma boa parte do código para voces verem, e com sorte, uma alma me explicar o que esta acontecendo e me dizer o que faço pra resolver.

Quando tento dar um valor a uma variavel a partir do textfield, o programa mostra uma tela sem nada desenhado e me volta esse erro:

Classe Principal

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

public class Wallpaper extends JFrame {
    JButton botao1, botao2, desenhar;
    JRadioButton retangulo, elipse, linha, girar;
    JTextField cordefundo, colunaRetangulo, linhaRetangulo, larguraRetangulo, comprimentoRetangulo, 
            colunaElipse, linhaElipse, larguraElipse, comprimentoElipse,
            colunaLinha, linhaLinha, larguraLinha, comprimentoLinha;
    JLabel cordefundoL, colunaRetanguloL, linhaRetanguloL, larguraRetanguloL, comprimentoRetanguloL,
            colunaElipseL, linhaElipseL, larguraElipseL, comprimentoElipseL,
            colunaLinhaL, linhaLinhaL, larguraLinhaL, comprimentoLinhaL;
    String colunaRV,comprimentoRV,linhaRV,larguraRV,colunaEV,comprimentoEV,linhaEV,larguraEV,colunaLV,comprimentoLV,linhaLV,larguraLV;

    public Wallpaper() { //Frame
    setTitle("Wallpapers");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);
    setSize(1024, 700);
    Container tela = getContentPane();
    setLayout(null);
    setLocationRelativeTo(null);
    
    //Botoes
    botao1 = new JButton ("Desenhar");
    botao2 = new JButton ("Girar a imagem");
    botao1.setBounds(50,30,150,20);
    botao2.setBounds(50,60,150,20);
    botao1.setVisible(true);
    botao2.setVisible(true);
    
    //RadioButtons
    retangulo = new JRadioButton("Retangulo");
    elipse = new JRadioButton("Elipse");
    linha = new JRadioButton("Linha");
    retangulo.setBounds(300,30,300,20);
    elipse.setBounds(300,120,300,20);
    linha.setBounds(300,210,300,20);
    retangulo.setVisible(true);
    elipse.setVisible(true);
    linha.setVisible(true);

               //Textfield
    //Retangulo ( o da elipse e da linha estao iguais a este)
    colunaRetangulo = new JTextField("");
    colunaRetangulo.setBounds(300,90,50,20);
    colunaRetangulo.setVisible(true);

    linhaRetangulo = new JTextField("");
    linhaRetangulo.setBounds(400,90,50,20);
    linhaRetangulo.setVisible(true);

    larguraRetangulo = new JTextField("");
    larguraRetangulo.setBounds(500,90,50,20);
    larguraRetangulo.setVisible(true); 

    comprimentoRetangulo = new JTextField("");
    comprimentoRetangulo.setBounds(600,90,50,20);
    comprimentoRetangulo.setVisible(true);

//Adicionar à tela
    tela.add(botao1);
    tela.add(botao2);
    tela.add(retangulo);
    tela.add(elipse);
    tela.add(linha);
    tela.add(cordefundo);
    tela.add(cordefundoL);

    //Retangulo
    tela.add(colunaRetangulo);
    tela.add(linhaRetangulo);
    tela.add(comprimentoRetangulo);
    tela.add(larguraRetangulo);

    //Labels Retangulo
    tela.add(colunaRetanguloL);
    tela.add(linhaRetanguloL);
    tela.add(comprimentoRetanguloL);
    tela.add(larguraRetanguloL);

    setVisible(true);

    botao1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            if (retangulo.isSelected() == true && elipse.isSelected() == true && linha.isSelected() == true){

                    colunaRV = (colunaRetangulo.getText());
                    linhaRV = (linhaRetangulo.getText());
                    larguraRV = (larguraRetangulo.getText());
                    comprimentoRV = (comprimentoRetangulo.getText());

                    colunaEV = (colunaElipse.getText());
                    linhaEV = (linhaElipse.getText());
                    larguraEV = (larguraElipse.getText());
                    comprimentoEV = (comprimentoElipse.getText());

                    colunaLV = (colunaLinha.getText());
                    linhaLV = (linhaLinha.getText());
                    larguraLV = (larguraLinha.getText());
                    comprimentoLV = (comprimentoLinha.getText());

                RELJFrame jframeREL = new RELJFrame();
                jframeREL.setVisible(true);
                
            } else if (retangulo.isSelected() == true && elipse.isSelected() == true && linha.isSelected() == false)
                {
                    REJFrame jframeRE = new REJFrame();
                    jframeRE.setVisible(true);
                } else if (retangulo.isSelected() == true && elipse.isSelected() == false && linha.isSelected() == true){
                    RLJFrame jframeRL = new RLJFrame();
                    jframeRL.setVisible(true);
                } else if (retangulo.isSelected() == false && elipse.isSelected() == true && linha.isSelected() == true){
                    ELJFrame jframeEL = new ELJFrame();
                    jframeEL.setVisible(true);
                }
              }
            
        }
    );
 }
    
    public static void main(String[] args) {
       new Wallpaper();
     }
}

JPanel REL

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.*;
import javax.swing.*;

public class REL extends JPanel {
    Wallpaper jframeWallpaper = new Wallpaper();

    public Rectangle2D r(){
        return new Rectangle2D.Double(Double.parseDouble(jframeWallpaper.colunaRV),Double.parseDouble(jframeWallpaper.linhaRV),Double.parseDouble(jframeWallpaper.larguraRV),Double.parseDouble(jframeWallpaper.comprimentoRV));
    }
    public Line2D l(){
        return new Line2D.Double(Double.parseDouble(jframeWallpaper.colunaLV),Double.parseDouble(jframeWallpaper.linhaLV),Double.parseDouble(jframeWallpaper.larguraLV),Double.parseDouble(jframeWallpaper.comprimentoLV));
    }
    public Ellipse2D e(){
        return new Ellipse2D.Double(Double.parseDouble(jframeWallpaper.colunaEV),Double.parseDouble(jframeWallpaper.linhaEV),Double.parseDouble(jframeWallpaper.larguraEV),Double.parseDouble(jframeWallpaper.comprimentoEV));
    }

    @Override
   public void paintComponent(Graphics graphics)
    {
       super.paintComponent(graphics);  // Invocando a execução do método paintComponent da super classe.

      Graphics2D g = (Graphics2D) graphics.create(); //Isso faz a cópia

      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
      g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);

      g.setColor(Color.BLACK);
      g.fillRect(0, 0, getWidth(), getHeight());

      Dimension size = getSize();
      double w = size.getWidth();
      double h = size.getHeight();
      
      g.setStroke(new BasicStroke(3));
      g.setColor(Color.WHITE);
      
         AffineTransform at =
         AffineTransform.getTranslateInstance(w / 2, h / 2);
         g.draw(at.createTransformedShape(l()));
         g.draw(at.createTransformedShape(r()));
         g.draw(at.createTransformedShape(e()));

     g.dispose();
   }    
 }

Esse é o JFrame que recebe o JPanel REL (REL quer dizer Retangulo Elipse e Linha, respectivamente)

import javax.swing.*;

public class RELFrame extends JFrame{

    public RELFrame(){
    add(new REL());
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setTitle("RE");
    setResizable(false);
    setVisible(true);
    setSize(800,600);
    setLocationRelativeTo(null);
    }
public static void main (String [] args){
    new RELFrame();
}
}

Isso é o que da postar e voces entenderem perfeitamente...Os outros JPanels e JFrames sao iguais ao JPanel REL e ao JFrame REL, o que muda é o que eles desenham.

Esse é o erro que o NetBeans volta quando clico no botao 1:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:991)
at java.lang.Double.parseDouble(Double.java:510)
at wallpapers.REL.l(REL.java:22)
at wallpapers.REL.paintComponent(REL.java:50)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent.paint(JComponent.java:1015)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
at java.awt.Container.paint(Container.java:1780)
at java.awt.Window.paint(Window.java:3375)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Como eu resolvo o problema de minhas variaveis nao receberem o valor dos textfields quando clico no botao1?

Criado 22 de março de 2011
Ultima resposta 28 de mar. de 2011
Respostas 11
Participantes 2