Problemas: Swing e dificuldade em obter documentação

7 respostas
F

Galerinha,

Li todos os tópicos pinados e não vi nada que me respondesse.

De qualquer modo, nada que seja avançado tenho capacidade, ainda, de compreender alguma coisa.

No começo estava feliz, acreditando que a documentoda da SUN era mais do que suficiente para “despertar” o programar que existem em mim - :stuck_out_tongue:

http://java.sun.com/developer/onlineTraining/index.html
http://java.sun.com/javase/reference/tutorials.jsp
http://java.sun.com/learning/index.html
http://java.sun.com/developer/onlineTraining/new2java/index.html

http://java.sun.com/docs/books/tutorial/index.html
http://java.sun.com/developer/onlineTraining/essentials/

http://java.sun.com/javase/6/docs/
http://java.sun.com/javase/6/docs/#demos
http://java.sun.com/javase/6/docs/api/index.html

Acontece que não entendo bulhufas da documentação API do Java - me parece ter sido feita extremamente desmotivada, parece ter sido criado automaticamente, sabe-se lá por javadoc, :stuck_out_tongue:

E crente que poderia rodar pelo menos os exemplos - mesmo sem saber o que estava ocorrendo -, nem isso funcionou!

package components;

import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.ImageIcon;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

/* 
 * ButtonDemo.java requires the following files:
 *   images/right.gif
 *   images/middle.gif
 *   images/left.gif
 */
public class ButtonDemo extends JPanel
                        implements ActionListener {
    protected JButton b1, b2, b3;

    public ButtonDemo() {
        ImageIcon leftButtonIcon = createImageIcon("images/right.gif");
        ImageIcon middleButtonIcon = createImageIcon("images/middle.gif");
        ImageIcon rightButtonIcon = createImageIcon("images/left.gif");

        b1 = new JButton("Disable middle button", leftButtonIcon);
        b1.setVerticalTextPosition(AbstractButton.CENTER);
        b1.setHorizontalTextPosition(AbstractButton.LEADING); //aka LEFT, for left-to-right locales
        b1.setMnemonic(KeyEvent.VK_D);
        b1.setActionCommand("disable");

        b2 = new JButton("Middle button", middleButtonIcon);
        b2.setVerticalTextPosition(AbstractButton.BOTTOM);
        b2.setHorizontalTextPosition(AbstractButton.CENTER);
        b2.setMnemonic(KeyEvent.VK_M);

        b3 = new JButton("Enable middle button", rightButtonIcon);
        //Use the default text position of CENTER, TRAILING (RIGHT).
        b3.setMnemonic(KeyEvent.VK_E);
        b3.setActionCommand("enable");
        b3.setEnabled(false);

        //Listen for actions on buttons 1 and 3.
        b1.addActionListener(this);
        b3.addActionListener(this);

        b1.setToolTipText("Click this button to disable the middle button.");
        b2.setToolTipText("This middle button does nothing when you click it.");
        b3.setToolTipText("Click this button to enable the middle button.");

        //Add Components to this container, using the default FlowLayout.
        add(b1);
        add(b2);
        add(b3);
    }

    public void actionPerformed(ActionEvent e) {
        if ("disable".equals(e.getActionCommand())) {
            b2.setEnabled(false);
            b1.setEnabled(false);
            b3.setEnabled(true);
        } else {
            b2.setEnabled(true);
            b1.setEnabled(true);
            b3.setEnabled(false);
        }
    }

    /** Returns an ImageIcon, or null if the path was invalid. */
    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = ButtonDemo.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

    /**
     * Create the GUI and show it.  For thread safety, 
     * this method should be invoked from the 
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {

        //Create and set up the window.
        JFrame frame = new JFrame("ButtonDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        ButtonDemo newContentPane = new ButtonDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(); 
            }
        });
    }
}

Compila e dá:

C:\USR\CVV\BlueJ\Pro\Sun>java ButtonDemo
Exception in thread "main" java.lang.NoClassDefFoundError: ButtonDemo (wrong nam
e: components/ButtonDemo)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

Não é o único ou primeiro exemplo que dá erro. Em casa uso MS-Windows 2K e já testei na faculdade - Suse 10 - e dá erro também.

Tenho JDK 1.6.0 instalado.

Pequisei no Google, e achei uma apostila da PUC-RJ, peguei os códigos e fui compilar… deu falando que o código era muito antigo.

E isso é que mata meu coração.

Não tenho condição alguma de comprar um livro no momento e gostaria imensamente de aprender a programar com modo gráfico no Java - só aprendo JAVA porque é exigido na faculdade.

Outro exemplo:

Vejo em sítios e livros coisas como:

JOptionPane.showMessageDialog(frame,output,"Aviso",ERRO_MESSAGE );

Enquanto que só roda aqui em casa e na faculdade:

JOptionPane.showMessageDialog(null,output,"Aviso",1)

Sinceramente, isso já acabou com minha paciência.

Gostaria, portanto, se possível, que me endicassem um livro - e-book - ou sítio onde pudesse aprender.

Obrigado.

7 Respostas

P

Olá, verifica a tua instalação do java deve ter algum problema que está impossibilitando a execução dos exemplos.

Copiei o código e compilei tal qual vc postou assima e rodou perfeitamente.

Pode ser também problema com a IDE, vc esta utilizando o BlueJ certo??? Tenta com outra IDE para desencargo de consiencia, blz??

Eclipse ou JCreator por exemplo!

http://www.eclipse.org/downloads/

http://www.jcreator.com/download.htm

É isso, qualquer coisa posta novamente.

Até mais, Filipe.

F

phill,

Em primeiro lugar, muito obrigado pela ajuda.

Não. Prefiro escrever sozinho meus códigos. Tenho BlueJ e Eclipses instalados, ainda não testei JCreator.

Faço tudo pelo Notepad++, javac e java.

Por isso, gostaria de uma documentação completa.

import javax.swing.*;

public class UmaPop {
	public static void main(String[] argumentin) {
		JOptionPane.showMessageDialog(null,"alert","alert",JOptionPane.ERROR_MESSAGE);
		JOptionPane.showMessageDialog(null,"alert","alert",0); 	
	}
}

/*
Descobri que "0" e "JOptioPane.ERROR_MESSAGE" são sinônimos, mas através do código de um amigo meu, e não através de documentação.

Veja link:
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JOptionPane.html
*/

Acabei de rodar pelo Eclipse.

Ele criou um pasta “components”, colocou o .class lá, deixou o .classpath na pasta raiz, e rodou.

Foi apenas isso que foi feito?

É possível que eu faça o mesmo sem ele?!

Não consegui.

Muito obrigado.

P

Olá, o que o Eclipse criou é para separar os .class dos .java, vc deve ter observado isso, sem contar que fica uma coisa mais organizada tmb.

Com relação a documentação, o ideal é vc consultar a API do Java, como dizia um professor “só a API salva!”.

É interessante você aderir ao uso de alguma IDE, a medida que vc for implementar aplicações mais profissionais ela irá te proporcionar varias facilidades, como por exemplo gerar os arquivos .jar (os executaveis do java).

Você até pode desenvolver diretamente no notepad, mas isso tornará o processo de desenvolvimento mais complexo.

Espero ter respondido aos teus questionamentos, qualquer duvida posta novamente, blz??

Att, Filipe.

F

phill,

Em primeiro lugar, muito obrigado novamente.

Imagino que já esteja de saco cheio de mim, mas prometo: é a última.

E quem a entende? :stuck_out_tongue:
Até conheço o site, visito até API 1.6.0 - a mesma versão do meu JDK… mas nunca consegui aprender nada.

Mas não é essa a pergunta!

Veja:

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class HelloWorldSWT {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("Hello world!");
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) display.sleep();
		}
		
		display.dispose();
		

	}

}

Seguindo seu conselho, resolvi usar o Eclipse, e o mesmo me sugiriu fazer uma janelinha em SWT. Maravilha!

Segui os passo… e roudou! :smiley:

Maravilha?!

Não aprendi absolutamente nada.
Pelo o que entendi é preciso uma biblioteca - não sei se este é o termo - estranha às bibliotecas nativas de java.

Não quero de modo algum me tornar dependente de uma IDE - se por qualquer motivo ficar sem o Eclipse deixo de ser “programador”(??), logo, me questiono a qualidade deste título.

Gostaria apenas de uma documentação decente.

Não consegui ainda, fazer nenhuma janela que tenha sido criada por mim, ou pelo menos que não se utilize de uma IDE.

Como disse, quero aprender. Não criar vícios.

Responda, portanto e se possível, esta última pergunta:

Swing é apenas uma “extensão” - me desculpe o vocabulário, realmente, sei muito pouco - do SWT, sendo assim sempre utilizada em conjunto? Ou completamente idependente, mas pode ser utilizada em conjunto. Ou seja, preciso aprender SWT antes do Swing ou não tem nada a ver.

Novamente obrigado!

E obrigado pela resposta - não irei postar mais nada, :smiley:

P

Olá, quando vc faz um import

import javax.swing.*;

vc esta utilizando todas as classes que estão abaixo do swing, como por exmplo JTextField, JPanel, JTextArea, enfim todas as classes que ficam abaixo do swing. Você tmb pode importar somente a classe que vc vai utilizar como por exemplo:

import javax.swing.JPanel; import javax.swing.JOptionPane;

Certo??

Com relação ao SWT - The Standard Widget Toolkit - ou tentando traduzir, ferramentas padrão para o desenvolvimento de interface grafica de interação com o usuario, mais ou menos isso.

Você pode usar somente a classe que vc precisa, como mostrado acima nos imports do JPanel e JOptionPane, ou todas as classes abaixo do swing.

Não sei porqe a dificuldade em consultar a API, nela voce pode exclarecer as duvidas e tmb baixar um codigo pronto.

Vamos tomar como exemplo a classe JTextField, neste link vc encontrará toda a documentação desta classe, assim como os metodos que ela implementa.
Nesta pagina terá o link How to Use Text Fields que vc pode baixar o codigo de um exemplo e analiza. Ok??

Espero ter exclarecido, caso contrario posta novamente…

Att, Filipe.

F

Conforme havia prometido, nada de dúvidas.

Apenas agradecimentos, Muito obrigado!

(…)

Pois bem, entrei no links… baixei o exemplo da SUN, compilou e na hora de rodar deu erro. Veja o código:

package components;

/* TextDemo.java requires no other files. */

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

public class TextDemo extends JPanel implements ActionListener {
    protected JTextField textField;
    protected JTextArea textArea;
    private final static String newline = "\n";

    public TextDemo() {
        super(new GridBagLayout());

        textField = new JTextField(20);
        textField.addActionListener(this);

        textArea = new JTextArea(5, 20);
        textArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(textArea,
                                       JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                       JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        //Add Components to this panel.
        GridBagConstraints c = new GridBagConstraints();
        c.gridwidth = GridBagConstraints.REMAINDER;

        c.fill = GridBagConstraints.HORIZONTAL;
        add(textField, c);

        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        c.weighty = 1.0;
        add(scrollPane, c);
    }

    public void actionPerformed(ActionEvent evt) {
        String text = textField.getText();
        textArea.append(text + newline);
        textField.selectAll();

        //Make sure the new text is visible, even if there
        //was a selection in the text area.
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event dispatch thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("TextDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Add contents to the window.
        frame.add(new TextDemo());

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

Veja o erro:

C:\USR\CVV\BlueJ\Pro\Sun>javac TextDemo.java

C:\USR\CVV\BlueJ\Pro\Sun>java TextDemo
Exception in thread "main" java.lang.NoClassDefFoundError: TextDemo (wrong name:
 components/TextDemo)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

O mesmo erro de sempre. Porém, me lembrei do que o Eclipse fez:
Criou uma pasta chamada “components” e colocou tudo lá dentro. Olhei pra essa linha e tive certeza:

(wrong name: components/TextDemo)

Aquela 1º linha de código deve ser o responsável por isso, portanto, a coloquei como um comentário:

//package components;

E agora funciona!

Obrigado!

Talvez, todos os erros, ou pelo menos a maioria, tenha sido só isso.

O código para quem não entendeu e tem o mesmo problema meu:

//package components;

/* TextDemo.java requires no other files. */

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

public class TextDemo extends JPanel implements ActionListener {
    protected JTextField textField;
    protected JTextArea textArea;
    private final static String newline = "\n";

    public TextDemo() {
        super(new GridBagLayout());

        textField = new JTextField(20);
        textField.addActionListener(this);

        textArea = new JTextArea(5, 20);
        textArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(textArea,
                                       JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                       JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        //Add Components to this panel.
        GridBagConstraints c = new GridBagConstraints();
        c.gridwidth = GridBagConstraints.REMAINDER;

        c.fill = GridBagConstraints.HORIZONTAL;
        add(textField, c);

        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        c.weighty = 1.0;
        add(scrollPane, c);
    }

    public void actionPerformed(ActionEvent evt) {
        String text = textField.getText();
        textArea.append(text + newline);
        textField.selectAll();

        //Make sure the new text is visible, even if there
        //was a selection in the text area.
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event dispatch thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("TextDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Add contents to the window.
        frame.add(new TextDemo());

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

[]'s

P

Olá, realmente os erros anteriores podem ter sido por este motivo mesmo.

A linha do inicio expecifica qual pacote a classe em questão pertence, neste caso a classe TextDemo pertence ao pacote componente.

Os pacotes são importante quando voce tem mais de uma classe e uma classe depende da outra.

Por exemplo: um metodo protected pode ser visto por uma outra classe desde que esteja dentro do mesmo pacote, já os metodos public podem ser vistos por qualquer classe estando ela dentro do mesmo pacote ou não e os metodos tipo private somente são visualizados pela propria classe.

Neste exemplo acima como é apenas uma classe vc nao precisa usar um pacote.

Valeu.!!

Criado 17 de maio de 2007
Ultima resposta 24 de mai. de 2007
Respostas 7
Participantes 2