Idéias - Construíndo uma área de trabalho em swing!

Eu estava aqui pensando de como são feitas aquelas áreas de trabalho em swing, a exemplo de um report da vida como o Jasper, como eles fizeram aquela área? No matisse do NetBeans, e em tantos outros programas similares.

Então minha curiosidade aumentou, pensei em algo como um panel onde com as funções de drag e drop seria possível jogar componentes lá, fiz alguns exemplo, ficou simples, mas longe de uma área de trabalho como essas que falei. Não sei como eles fazem para deixar de um jeito tão diferente. :slight_smile:

São usadas muitas linhas de código…

Muita implementação, não é tarefa fácil fazer um designer como o matisse, muito menos com a qualidade do mesmo!!

A minha idéia não era fazer um matisse 2, e nem quero isso, mas sim criar uma plataforma de trabalho parecida (no sentido de vc ter uma paleta de recusos e ícones e poder arrastar para essa plataforma), tipo em reports, programas gráficos ou mesmo matisse.

Vou tentar fazer alguns exemplos aqui, e talvez amanhã eu consiga postar.

Sim, eu compreendi, apenas disse que fazer um visual designer, seja para o que for, envolve muito trabalho :slight_smile:

pq não desenvolve plugins, para netbeans ou eclipse, e utiliza essas duas IDE’s como plataforma??

Pronto pessoal, já consegui criar os pontos da grid. Dessa forma no próximo exemplo que eu criar, farei um obtejo dragable tentar “fitar/fixar” na grid. Vejam esse exemplo de criação dos pontos.

Bom, um dia chego lá!

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

/**
 * O intúito desse fonte é fazer que construámos no formulário uma grid de milhares de pontos.
 * Os pontos servem para "prender" os componentes a serem arastados nele, dando a impressão que estão presos
 * em uma grid "grap to grid". Para isso é necessário usar recursos de Java2D para conseguir tal feito.
 * O próximo passo e fazer um componente dragable e que possa "fixar" nessa grid.
 * @author Inocêncio
 */
public class FormBuilder01 extends JFrame {

    public FormBuilder01() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400,400);
        setTitle("Desenhando pontos...");
        
        Pointer pointer = new Pointer();
        add(pointer);
        
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                setVisible(false);
                dispose();
                System.exit(0);
            }
        });
        
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new FormBuilder01();
    }

}

class Pointer extends Canvas {
    
    Pointer() {
    }
    
    @Override
    public void paint(Graphics g) {
        int i = 0;

        //desenhando as linhas e colunas
        
        //x - linha
        for (int x = 0; x < 200; x++) {
            //i - colunas
            for (i = 0; i < 300; i++) {
                g.fillArc(i*7, 5 * x, 1, 1, 0, 360);
            }
        }
    }
}

Fiz um jlabel se mover na tela, agora o problema é sobreposição, já que tenho um grid de pontos, ela sobrepoem o JLabel, reparei quando limitei o tamanho da grid, o componente de label aparece na tela, mas se eu move-lo para o local da grid, resulta em sobreposição dela em relação ao label. Mas vou conseguir achar uma forma de resolver isso. Resolvendo isso, o próximo passo será fixar o componente na grid.

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;


/**
 * @author Inocêncio
 */
public class FormBuilder02 extends JFrame {

    public FormBuilder02() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400,400);
        setTitle("Desenhando pontos...");
        
        //setando layout nulo
        setLayout(null);
        
        //criando um componente para ser arrastado
        final JLabel nome = new JLabel("Nome:");
        nome.setBounds(10, 10, 120, 80);
        nome.setFont(new Font("arial", Font.BOLD, 30));
        nome.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        nome.addMouseMotionListener(new MouseMotionAdapter() {

            @Override
            public void mouseDragged(MouseEvent e) {
                mouseDragDrop(e, nome);
            }
            
        });
        
        Pointer pointer = new Pointer();
        pointer.setBounds(0, 0, 2000, 2000);
        add(pointer);
        add(nome);
        
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                setVisible(false);
                dispose();
                System.exit(0);
            }
        });
        
        setVisible(true);
    }
    
    public void mouseDragDrop(MouseEvent e, JLabel rotulo) {
        int x = rotulo.getLocation().x;
        int y = rotulo.getLocation().y;
        
        rotulo.setLocation( (e.getX() + x) - (rotulo.getWidth() /2),
                (e.getY() + y) - (rotulo.getHeight() /2));
        
        repaint();
        x = e.getX();
        y = e.getY();
    }
    
    public static void main(String[] args) {
        new FormBuilder02();
    }

}
class Pointer extends Canvas {
    
    Pointer() {
    }
    
    @Override
    public void paint(Graphics g) {
        int i = 0;

        //desenhando as linhas e colunas
        
        //x - linha
        for (int x = 0; x < 200; x++) {
            //i - colunas
            for (i = 0; i < 300; i++) {
                g.fillArc(i*7, 5 * x, 1, 1, 0, 360);
            }
        }
    }
}