Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1

    Aggiungere componenti in un JPanel disegnato

    Ho un JPanel con un OverlayLayout dove ho disegnato, non riesco ad aggiungere componenti soprail JPanel un consiglio su come fare??

  2. #2
    suppongo che nel metodo paintComponent non ha richiamato il super....

  3. #3
    nono l'ho fatto almeno credo e ho scritto super.paintComponent(g); giusto??

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    prova
    codice:
    tuoPannello.revalidate();
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Niente da fare Questo è il codice...

    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import javax.swing.*;
    import java.util.ArrayList;

    public class MiddlePanel extends JPanel implements MouseListener,MouseMotionListener{

    int paintWidth = 800;
    int paintHeigth = 600;
    int x0,y0;
    boolean out, //Indica se il cursore è fuori dalla finestra
    drag, //Indica se il cursore è trascinato
    butgateact; //Indica se è stato attivato un pulsante porta della toolbar
    Image imgtmp;
    ImageIcon imgicontmp;

    ArrayList<JLabel> gate = new ArrayList();

    public MiddlePanel(){
    x0 = getHeight()/2-8;
    y0 = getWidth()/2-8;
    out = true;
    addMouseListener(this);
    addMouseMotionListener(this);
    this.setLayout(new OverlayLayout(this));
    JLabel j = new JLabel();
    j.setBounds(30,30,30,30);
    j.setVisible(true);
    this.add(j);
    this.setBackground(Color.white);
    }

    @Override
    public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.LIGHT_GRAY);
    paintGateTmp(g);
    paintGrid(g);
    }

    public void paintGateTmp(Graphics g){
    if(butgateact && !out)
    g.drawImage(imgtmp,x0-11,y0-12,this);
    }

    public void paintGrid(Graphics g){
    for(int i=0; i<getWidth(); i+=20) {
    g.drawLine(i,0,i,getHeight());
    g.drawLine(0,i,getWidth(),i);
    }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    System.out.println("Mouse cliccato");
    JLabel Jlbltmp = new JLabel(imgicontmp);
    Jlbltmp.setLocation(x0,y0);
    Jlbltmp.setSize(30,30);
    Jlbltmp.setVisible(true);
    gate.add(Jlbltmp);
    this.add(Jlbltmp);
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    System.out.println("Pulsante rilasciato");
    drag = false;
    butgateact = false;
    imgtmp = null;
    imgicontmp = null;
    repaint();
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    System.out.println("Mouse entrato");
    out = false;
    repaint();
    }

    @Override
    public void mouseExited(MouseEvent e) {
    out = true;
    repaint();
    }

    @Override
    public void mouseDragged(MouseEvent e) {
    System.out.println("Pulsante trascinato");
    x0 = e.getX();
    y0 = e.getY();
    drag = true;
    repaint();
    }

    @Override
    public void mouseMoved(MouseEvent e) {
    drag = false;
    repaint();
    }

    public void setImageTmp(Image i){
    imgtmp = i;
    imgicontmp = new ImageIcon(i);
    butgateact = true;
    out = false;
    drag = true;
    }
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ho scritto un piccolo esempio:
    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    /**
     *
     * @author Andrea
     */
    public class OverlayLayoutTest extends JFrame {
        
        private class MyMouseAdapter extends MouseAdapter {
            JButton button;
            public void mouseClicked (MouseEvent me) {
                button = new JButton("Bottone # "+count++);            
                button.setBounds(me.getX(), me.getY(), button.getWidth(), button.getHeight());            
                overlayPanel.add(button);
                overlayPanel.revalidate();       
            }
        }
        
        JPanel overlayPanel;    
        int count = 1;
        
        public OverlayLayoutTest() {
            super("Overlay Layout Test");
            this.setSize(600,400);
            overlayPanel = new JPanel() {
                public boolean isOptimizedDrawingEnabled() {
                    return false;
                }
            };
            LayoutManager overlay = new OverlayLayout(overlayPanel) { 
                public void layoutContainer(Container target) {  
                    int nChildren = target.getComponentCount();
                    
                    for (int i = 0; i < nChildren; i++){  
                        Component c = target.getComponent(i);  
                        c.setBounds(c.getLocation().x, c.getLocation().y,   
                                c.getPreferredSize().width, c.getPreferredSize().height);  
                    }  
                }
            };
            overlayPanel.setLayout(overlay);        
            
            this.getContentPane().add(overlayPanel, BorderLayout.CENTER);
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            overlayPanel.addMouseListener(new MyMouseAdapter());
        }
        
        public static void main (String[] args) {
            new OverlayLayoutTest();
        }
           
        
    }
    con un po' di ispirazione dal web.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Grazie proverò il tuo metodo

  8. #8
    Allora funziona e ti ringrazio Cmq avrei 4 ultime domande:
    1) Vorrei capire da cosa dipendeva il fatto che non si vedevano le JLabel per come l'avevo fatto io.
    2) A che serve revalidate()?
    3)Poi le immagini le faccio posizionare tramite spostamento del mouse, soltanto nel momento in cui clicco non me lo posiziona esattamente accanto ma un pò a destra come posso risolvere??
    4)Invece se voglio posizionarle tramite trascinamento e non tramite movimento come faccio??

    Ecco il codice:

    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import javax.swing.*;
    import java.util.ArrayList;

    public class MiddlePanel extends JPanel implements MouseListener,MouseMotionListener{

    int paintWidth = 800;
    int paintHeigth = 600;
    int x0,y0;
    boolean out, //Indica se il cursore è fuori dalla finestra
    drag, //Indica se il cursore è trascinato
    butgateact; //Indica se è stato attivato un pulsante porta della toolbar
    Image imgtmp;
    ImageIcon imgicontmp;

    ArrayList<JLabel> gate = new ArrayList();

    public MiddlePanel(){
    LayoutManager overlay = new OverlayLayout(this) {
    @Override
    public void layoutContainer(Container target) {
    int nChildren = target.getComponentCount();

    for (int i = 0; i < nChildren; i++){
    Component c = target.getComponent(i);
    c.setBounds(c.getLocation().x, c.getLocation().y,
    c.getPreferredSize().width, c.getPreferredSize().height);
    }
    }
    };
    this.setLayout(overlay);
    x0 = getHeight()/2-8;
    y0 = getWidth()/2-8;
    out = true;
    addMouseListener(this);
    addMouseMotionListener(this);
    JLabel j = new JLabel();
    j.setBounds(30,30,30,30);
    j.setVisible(true);
    this.add(j);
    this.setBackground(Color.white);
    }

    @Override
    public boolean isOptimizedDrawingEnabled() {
    return false;
    }

    @Override
    public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    g.setColor(Color.LIGHT_GRAY);
    paintGateTmp(g);
    paintGrid(g);
    }

    public void paintGateTmp(Graphics g){
    if(butgateact){
    g.drawImage(imgtmp,x0-11,y0-12,this);
    g.setColor(Color.DARK_GRAY); //Cambia il colore della griglia momentaneamente
    }
    }

    public void paintGrid(Graphics g){
    for(int i=0; i<getWidth(); i+=20) {
    g.drawLine(i,0,i,getHeight());
    g.drawLine(0,i,getWidth(),i);
    }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    System.out.println("Mouse cliccato");
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    System.out.println("Pulsante rilasciato");
    JLabel Jlbltmp = new JLabel(imgicontmp);
    gate.add(Jlbltmp);
    Jlbltmp.setBounds(e.getX(),e.getY(),Jlbltmp.getWid th(),Jlbltmp.getHeight());
    this.add(Jlbltmp);
    this.revalidate();
    drag = false;
    butgateact = false;
    imgtmp = null;
    imgicontmp = null;
    repaint();
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    System.out.println("Mouse entrato");
    out = false;
    repaint();
    }

    @Override
    public void mouseExited(MouseEvent e) {
    out = true;
    repaint();
    }

    @Override
    public void mouseDragged(MouseEvent e) {
    System.out.println("Pulsante trascinato");
    drag = true;
    }

    @Override
    public void mouseMoved(MouseEvent e) {
    drag = false;
    x0 = e.getX();
    y0 = e.getY();
    repaint();
    }

    public void setImageTmp(Image i){
    imgtmp = i;
    imgicontmp = new ImageIcon(i);
    butgateact = true;
    out = false;
    }
    }

    e poi la classe della ToolBar da dove attivo l'evento

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.swing.*;

    public class ToolGateBar extends JToolBar{

    JButton and;
    JButton or;
    JButton not;
    JButton xor;
    JButton line;
    Image img1 = Toolkit.getDefaultToolkit().getImage("img/Gate/and.gif");
    Image img2 = Toolkit.getDefaultToolkit().getImage("img/Gate/or.gif");
    Image img3 = Toolkit.getDefaultToolkit().getImage("img/Gate/nand.gif");
    Image img4 = Toolkit.getDefaultToolkit().getImage("img/Gate/nor.gif");
    Image img5 = Toolkit.getDefaultToolkit().getImage("img/Gate/xor.gif");
    Image img6 = Toolkit.getDefaultToolkit().getImage("img/Gate/nore.gif");
    Image img7 = Toolkit.getDefaultToolkit().getImage("img/Gate/not.gif");
    boolean out = false;

    public ToolGateBar(){

    super("Porte Logiche");

    and = new JButton();
    and.setSize(40,50);
    and.setIcon(new ImageIcon(img1.getScaledInstance(24,24,Image.SCALE _DEFAULT)));
    and.setBorder(null);
    and.setOpaque(false);
    and.addMouseListener(new MouseListener() {

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
    LCE01.Grafica.Split.MP.setImageTmp(img1);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    public void mouseDragged(MouseEvent e){
    out = true;
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
    });

    // and.addActionListener(new ActionListener() {
    //
    // @Override
    // public void actionPerformed(ActionEvent e) {
    // System.out.println("Pulsante premuto");
    // LCE01.Grafica.Split.MP.setImageTmp(img1);
    // }
    // });

    or = new JButton("or");
    or.setSize(40,50);
    or.setBorder(null);
    or.setOpaque(false);

    xor = new JButton("xor");
    xor.setSize(40,50);
    xor.setBorder(null);
    xor.setOpaque(false);

    not = new JButton();
    not.setSize(40,50);
    not.setIcon(new ImageIcon(img7.getScaledInstance(24,24,Image.SCALE _DEFAULT)));
    not.setBorder(null);
    not.setOpaque(false);

    line = new JButton("line");
    line.setSize(40,50);
    line.setBorder(null);
    line.setOpaque(false);

    this.add(and);
    this.add(or);
    this.add(xor);
    this.add(not);
    this.add(line);

    this.setVisible(true);
    }
    }

    cmq grazie della disponibilità

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    un po' di cose:

    - usa il tag CODE come previsto dal regolamento forum
    - usa le API (trovi la descrizione di revalidate nelle API di JPanel)
    - posizionamento: il MouseListener su chi lo attacchi? Se sul JFrame, c'è un offset (dovrebbero essere spostate in basso e a destra - credo sia lo spazio virtuale di default dei componenti NORTH e EAST riservati dal LayoutManager di default di un JFrame, ovvero BorderLayout. Se lo attacchi al JPanel non dovresti avere di questi problemi.
    - trascinamento: mouseDragged ed un po' di olio di gomito (codice), in particolare mi viene in mente qualcosa del genere
    - riconoscere se nel punto in cui hai clickato c'è un componente e se così
    - riconoscere dove si ferma l'azione di drag
    - spostare il componente (ovvero setBounds appropriato)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10
    Primo grazie delle dritte Secondo per il posizionamento ho risolto grazie
    per il trascinamento anche io avevo pensato a una cosa del genere soltanto che non mi riesce, il fatto è che io ho una toolbar dove ho un pulsante che non appena premuto deve attivare l'evento nel JPanel di sotto e quindi iniziare a disegnare, soltanto che non riconosce il pulsante trascinato perchè per il JPanel dovrei prima cliccare dentro di esso e poi iniziare a trascinarlo, un modo su come risolvere il problema?

    P.S. Qui il link con lo screenshot

    Link

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.