[RESOLVIDO] Bizarrice num formulário Swing gerado pelo NetBeans

12 respostas
H

Bom… alguém sabe me dizer porque isto:

public class LoginECFDialog extends javax.swing.JDialog {

    /** Creates new form LoginECFDialog */
    public LoginECFDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jTextField1 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);

        jTextField1.setFont(getFont());
        jTextField1.setText("jTextField1");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(213, 213, 213))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(86, 86, 86)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(90, Short.MAX_VALUE))
        );

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                LoginECFDialog dialog = new LoginECFDialog(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration

}
<?xml version="1.0" encoding="UTF-8" ?>

<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
  <Properties>
    <Property name="defaultCloseOperation" type="int" value="2"/>
    <Property name="resizable" type="boolean" value="false"/>
  </Properties>
  <SyntheticProperties>
    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
  </SyntheticProperties>
  <AuxValues>
    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-58,0,0,1,32"/>
  </AuxValues>

  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
  <SubComponents>
    <Container class="javax.swing.JPanel" name="jPanel1">
      <Constraints>
        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
          <BorderConstraints direction="Center"/>
        </Constraint>
      </Constraints>

      <Layout>
        <DimensionLayout dim="0">
          <Group type="103" groupAlignment="0" attributes="0">
              <Group type="102" attributes="0">
                  <EmptySpace max="-2" attributes="0"/>
                  <Component id="jTextField1" min="-2" max="-2" attributes="0"/>
                  <EmptySpace min="-2" pref="213" max="-2" attributes="0"/>
              </Group>
          </Group>
        </DimensionLayout>
        <DimensionLayout dim="1">
          <Group type="103" groupAlignment="0" attributes="0">
              <Group type="102" alignment="0" attributes="0">
                  <EmptySpace min="-2" pref="86" max="-2" attributes="0"/>
                  <Component id="jTextField1" min="-2" max="-2" attributes="0"/>
                  <EmptySpace pref="90" max="32767" attributes="0"/>
              </Group>
          </Group>
        </DimensionLayout>
      </Layout>
      <SubComponents>
        <Component class="javax.swing.JTextField" name="jTextField1">
          <Properties>
            <Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
              <Connection component="Form" name="font" type="property"/>
            </Property>
            <Property name="text" type="java.lang.String" value="jTextField1"/>
          </Properties>
        </Component>
      </SubComponents>
    </Container>
  </SubComponents>
</Form>

Está causando esta exceção?

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at javax.swing.text.Utilities.getTabbedTextWidth(Utilities.java:256)
        at javax.swing.text.Utilities.getTabbedTextWidth(Utilities.java:191)
        at javax.swing.text.PlainView.getLineWidth(PlainView.java:643)
        at javax.swing.text.PlainView.updateDamage(PlainView.java:541)
        at javax.swing.text.PlainView.insertUpdate(PlainView.java:425)
        at javax.swing.text.FieldView.insertUpdate(FieldView.java:276)
        at javax.swing.plaf.basic.BasicTextUI$RootView.insertUpdate(BasicTextUI.java:1590)
        at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.insertUpdate(BasicTextUI.java:1849)
        at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:185)
        at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:734)
        at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:693)
        at javax.swing.text.PlainDocument.insertString(PlainDocument.java:114)
        at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:655)
        at javax.swing.text.JTextComponent.setText(JTextComponent.java:1693)
        at com.ats.ecf.view.swing.login.LoginECFDialog.initComponents(LoginECFDialog.java:42)
        at com.ats.ecf.view.swing.login.LoginECFDialog.<init>(LoginECFDialog.java:23)
        at com.ats.ecf.view.swing.login.LoginECFDialog$1.run(LoginECFDialog.java:72)
        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)

A versão do Java é 1.6.0_19.

12 Respostas

thiago_spdvr

Debuga e ve exatamente onde o erro esta acontecendo. Fica mais facil de cercar e saber onde o erro esta acontecendo.

H

Foi mal, esqueci de falar este detalhe: o erro ocorre no momento em que é setado o texto do componente:

jTextField1.setText("jTextField1");
M

O componente jTextField1 não foi instanciado.

anuppu

Não parece. Aqui esta a linha onde o jTextField1 é instanciado:

M

Não parece. Aqui esta a linha onde o jTextField1 é instanciado:


Se o erro realmente acontece na linha apontada pelo autor do tópico o único problema que pode haver é a variável jTextField1 ser null.

O NetBeans as vezes faz umas coisas assim mesmo. Você já tentou atualizar o projeto, sair e entrar de novo do NetBeans e exorcizar o computador? Pode resolver.

H

OK, pessoal, descobri a causa do problema:

O componente em questão estava com a propriedade “font” vinculada à fonte do formulário, o qual estava usando a fonte padrão. Se a fonte do formulário for setada explicitamente (mesmo que seja a própria fonte padrão), o erro some.

Valeu pela ajuda. Fica aqui o post para o caso de alguém mais cair na mesma situação.

M

[quote=wellington.nogueira]

marcobiscaro2112:

Se o erro realmente acontece na linha apontada pelo autor do tópico o único problema que pode haver é a variável jTextField1 ser null.

O NetBeans as vezes faz umas coisas assim mesmo. Você já tentou atualizar o projeto, sair e entrar de novo do NetBeans e exorcizar o computador? Pode resolver.


Não é o caso. O trace é muito grande. Provavelmente, se fosse o JTextField nulo, teria terminado na linha

Na verdade eu nem vi o trace do erro. Eu só vi o seguinte:

[quote=haroldo-ok-ats]Foi mal, esqueci de falar este detalhe: o erro ocorre no momento em que é setado o texto do componente:

Numa circunstância dessas, a única coisa que poderia lançar um NullPointerException é o jTextField1 ser igual a null, concorda?

H

Normalmente, seria, mas se você olhar o trace (o que eu também confirmei via depuração), ele entrou dentro do setText(…), foi lá dentro do Document, invocou vários listeners e deu pau na hora de calcular a largura do texto. E tudo isto porque a fonte do Frame estava com o valor default… :slight_smile:

M

Normalmente, seria, mas se você olhar o trace (o que eu também confirmei via depuração), ele entrou dentro do setText(…), foi lá dentro do Document, invocou vários listeners e deu pau na hora de calcular a largura do texto. E tudo isto porque a fonte do Frame estava com o valor default… :slight_smile:
E aqui recaímos no ótimo título dado a este tópico: bizarrice. A fonte padrão do JFrame não é null. Agora, por qual motivo ela passou a ser null só o NetBeans (bom, talvez nem ele…) pode responder.

WellingtonRamos

haroldo-ok-ats:
Bom… alguém sabe me dizer porque isto:

//...
        jPanel1 = new javax.swing.JPanel();
        jTextField1 = new javax.swing.JTextField();
//...
        jTextField1.setFont(getFont());
        jTextField1.setText("jTextField1");
//..
    // Variables declaration - do not modify
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration

}

Realmente é estranho pois, apesar do erro, não é devido à mesma não ter sido instanciada.
Mas acho que o getFont está retornando null…

Me parece que o erro é na hora de atualizar o texto informado com as informações da fonte fornecida.

WellingtonRamos

marcobiscaro2112:

Se o erro realmente acontece na linha apontada pelo autor do tópico o único problema que pode haver é a variável jTextField1 ser null.

O NetBeans as vezes faz umas coisas assim mesmo. Você já tentou atualizar o projeto, sair e entrar de novo do NetBeans e exorcizar o computador? Pode resolver.


Não é o caso. O trace é muito grande. Provavelmente, se fosse o JTextField nulo, teria terminado na linha

WellingtonRamos

O que eu sei é que não é do NetBeans… Fiz na mão, no Eclipse e caiu no mesmo erro.

Exemplo de código:

import javax.swing.JDialog;


public class Teste {
	public Teste() {
		javax.swing.JDialog dialog = new javax.swing.JDialog();
		dialog.setPreferredSize(new java.awt.Dimension(200,200));
		javax.swing.JTextField field = new javax.swing.JTextField();

		System.out.println(dialog.getFont());

		//Assim funciona...
		dialog.getContentPane().add(field); //Troque esta linha de posição para após o setText!
		field.setFont(dialog.getFont());
		field.setText("Teste");
		
		dialog.pack();
		dialog.setVisible(true);
		
		dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		try{
			new Teste();
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
	}
}
//Assim não funciona...
		field.setFont(dialog.getFont());
		field.setText("Teste");
		dialog.getContentPane().add(field);

Minha suspeita: Nessa situação, ele ainda não conhece seu pai (internamente ele faz referência ao pai (no caso o ContentPane do JDialog)), então qualquer referência ao Font do mesmo acabaria por ser null.

Criado 20 de abril de 2010
Ultima resposta 20 de abr. de 2010
Respostas 12
Participantes 5