Ho un JPanel con un OverlayLayout dove ho disegnato, non riesco ad aggiungere componenti soprail JPanel un consiglio su come fare??
Ho un JPanel con un OverlayLayout dove ho disegnato, non riesco ad aggiungere componenti soprail JPanel un consiglio su come fare??
suppongo che nel metodo paintComponent non ha richiamato il super....
nono l'ho fattoalmeno credo
e ho scritto super.paintComponent(g); giusto??
prova
codice:tuoPannello.revalidate();
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"
Niente da fareQuesto è 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;
}
}
ho scritto un piccolo esempio:
con un po' di ispirazione dal web.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(); } }
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"
Grazie proverò il tuo metodo![]()
Allora funziona e ti ringrazioCmq 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à![]()
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"
Primo grazie delle dritteSecondo 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