View Full Version : [Java][NetBeans] Immagini.
In NetBeans, con matisse... Devo inserire un'immagine che deve ruotare di un tot di gradi inseriti dall'utente in una JTextField... (Minimo 0°, Massimo 90°) Come posso fare?
Help..
(45° post mio.. sulle immagini... XD)
In NetBeans, con matisse... Devo inserire un'immagine che deve ruotare di un tot di gradi inseriti dall'utente in una JTextField... (Minimo 0°, Massimo 90°) Come posso fare?Carica l'immagine in modo da avere un Image, crea una tua classe che estende ad esempio JPanel e in cui disegnerai in paintComponent() la immagine. Con rotate() di Graphics2D imposta un angolo di rotazione e .... disegna la immagine.
Mhm, quindi tipo:
JPanel jPanel1 = new JPanel();
Image image = ImageIO.read("path/asd.gif");
JLabel label = new JLabel(new ImageIcon( image ));
jPanel1.add(label);
JTextField angolo = new JTextField( 10);
jPanel1.add(angolo);
JButton check = new JBUtton();
check.addMouseListener(AscoltaMouseListener);
public void AscoltaMouseListener()
{
String angoloString = "";
float angoloFlo = 0;
try {
angoloString = angolo.getText();
angoloFlo = Float.parseFloat(angoloString);
int angoloInt = (int) angoloString; //ovviamente faccio un controllo in precedenza ce sia un int..
image.rotate(angoloInt);
}catch (Exception ex) {}
}
O mi sono confuso un poco?
Ho l'impressione di si...
EDIT: avevo dimenticato di chiamare il rotate.. XD
O mi sono confuso un poco?Ehm ... beh .. sì, un tantino ...
Image non ha un rotate(), poi già solo quel cast a int di un String fa venire i brividi ... e quindi non è assolutamente l'approccio giusto.
Questo è un esempio completo:
import java.awt.*;
import java.net.*;
import javax.imageio.*;
import javax.swing.*;
import javax.swing.event.*;
public class ImageRotationTestFrame extends JFrame
{
private ImagePanel imagePanel;
private JSlider slider;
public ImageRotationTestFrame ()
{
super ("Image Rotation Test");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setSize (400, 400);
try
{
Image img = ImageIO.read (new URL ("http://img158.imageshack.us/img158/8927/catum9.jpg"));
imagePanel = new ImagePanel (img);
slider = new JSlider (0, 360, 0);
getContentPane ().add (imagePanel, BorderLayout.CENTER);
getContentPane ().add (slider, BorderLayout.SOUTH);
slider.addChangeListener (new ChangeListener ()
{
public void stateChanged (ChangeEvent e)
{
imagePanel.setAngle (slider.getValue ());
}
});
}
catch (Exception e)
{
System.out.println (e);
}
}
public static void main (String[] args)
{
SwingUtilities.invokeLater (new Runnable ()
{
public void run ()
{
ImageRotationTestFrame f = new ImageRotationTestFrame ();
f.setVisible (true);
}
});
}
}
class ImagePanel extends JPanel
{
private Image img;
private double angle;
public ImagePanel (Image img)
{
this.img = img;
}
public void setAngle (double angle)
{
this.angle = Math.toRadians (angle);
repaint ();
}
public void paintComponent (Graphics g)
{
super.paintComponent (g);
Graphics2D g2d = (Graphics2D) g;
int panelWidth = getWidth ();
int panelHeight = getHeight ();
int imgWidth = img.getWidth (this);
int imgHeight = img.getHeight (this);
g2d.translate (panelWidth/2, panelHeight/2);
g2d.rotate (angle);
g2d.drawImage (img, -imgWidth/2, -imgHeight/2, this);
}
}
Basta lanciarlo (ci vuole un attimino perché carichi l'immagine) e poi è sufficiente trascinare lo slider per cambiare angolo.
Wow, avevo errato un poco. XD
Mhm, ok ti ringrazio! Vedo di adattarlo a ciò che mi serve!!
GRAZIE!!!
:D
Se hai provato il mio esempio, avrai visto che con le varie angolazioni, a parte i bordi sgranati, pure l'interno della immagine stessa appare un po' sgranato.
Prima del drawImage basta impostare:
g2d.setRenderingHint (RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
e si ottiene già una qualità decisamente superiore.
Si vabbè, io tanto devo ruotare una gif di pochi pixel... XD
Una cosa tipo 80pix*80pix..... Per cui non mi serve sia perfetta.. :D
..Mhm.. Ora sto un po lavorandoci per integrarlo nel mio lavoro.. :D
Comunque grazie mille per i suggerimenti!! ;)
Ecco il codice che ho fatto (anche con l'aiuto di netbeans XP)
/*
* GraphicX.java
*
* Created on 1 giugno 2008, 12.18
*/
package hittheplane;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.event.*;
/**
*
* @author Exol
*/
public class GraphicX extends JFrame {
/** Creates new form GraphicX */
public GraphicX() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
DESTROY = new javax.swing.JPopupMenu();
animationPanel = new javax.swing.JPanel();
Image img1 = ImageIO.read (new File ("./Cannoncino.gif"));
imagePanelRotate = new ImagePanel(img1);
comandPanel = new javax.swing.JPanel();
alzoLabel = new javax.swing.JLabel();
angleSlider = new javax.swing.JSlider(0, 90, 90);
speedLabel = new javax.swing.JLabel();
speedInput = new javax.swing.JTextField();
DELETE = new javax.swing.JLabel();
shotsLabel = new javax.swing.JLabel();
shotsInput = new javax.swing.JTextField();
shotButton = new javax.swing.JButton();
topMenu = new javax.swing.JMenuBar();
fileMenu = new javax.swing.JMenu();
newItemMenu = new javax.swing.JMenuItem();
fileJSeparator = new javax.swing.JSeparator();
exitItemMenu = new javax.swing.JMenuItem();
viewMenu = new javax.swing.JMenu();
highScoreItemMenu = new javax.swing.JMenuItem();
viewInstructionItemMenu = new javax.swing.JMenuItem();
viewShoutcutItemMenu = new javax.swing.JMenuItem();
impostMenu = new javax.swing.JMenu();
gameVAriablesItemMenu = new javax.swing.JMenuItem();
impostUserItemMEnu = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Hit The Plane");
setBackground(new java.awt.Color(255, 255, 255));
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
setName("MainFrame"); // NOI18N
setResizable(false);
animationPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
animationPanel.setDebugGraphicsOptions(javax.swing.DebugGraphics.BUFFERED_OPTION);
animationPanel.setMaximumSize(new java.awt.Dimension(1140, 690));
animationPanel.setMinimumSize(new java.awt.Dimension(380, 230));
animationPanel.setPreferredSize(new java.awt.Dimension(760, 460));
org.jdesktop.layout.GroupLayout imagePanelRotateLayout = new org.jdesktop.layout.GroupLayout(imagePanelRotate);
imagePanelRotate.setLayout(imagePanelRotateLayout);
imagePanelRotateLayout.setHorizontalGroup(
imagePanelRotateLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 100, Short.MAX_VALUE)
);
imagePanelRotateLayout.setVerticalGroup(
imagePanelRotateLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 100, Short.MAX_VALUE)
);
org.jdesktop.layout.GroupLayout animationPanelLayout = new org.jdesktop.layout.GroupLayout(animationPanel);
animationPanel.setLayout(animationPanelLayout);
animationPanelLayout.setHorizontalGroup(
animationPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(animationPanelLayout.createSequentialGroup()
.add(imagePanelRotate, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(656, Short.MAX_VALUE))
);
animationPanelLayout.setVerticalGroup(
animationPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, animationPanelLayout.createSequentialGroup()
.addContainerGap(339, Short.MAX_VALUE)
.add(imagePanelRotate, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
);
comandPanel.setBackground(new java.awt.Color(204, 204, 204));
comandPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Comandi Gioco", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION));
comandPanel.setMaximumSize(new java.awt.Dimension(1140, 114));
comandPanel.setMinimumSize(new java.awt.Dimension(380, 38));
comandPanel.setName("ComandiGioco"); // NOI18N
comandPanel.setPreferredSize(new java.awt.Dimension(760, 76));
alzoLabel.setText("Alzo");
comandPanel.add(alzoLabel);
angleSlider.setInverted(true);
angleSlider.addChangeListener (new ChangeListener ()
{
public void stateChanged (ChangeEvent e)
{
imagePanelRotate.setAngle (angleSlider.getValue ());
}
});
comandPanel.add(angleSlider);
speedLabel.setText("Veloc.");
comandPanel.add(speedLabel);
speedInput.setText("05");
comandPanel.add(speedInput);
comandPanel.add(DELETE);
shotsLabel.setText("Raffica");
comandPanel.add(shotsLabel);
shotsInput.setText("1");
comandPanel.add(shotsInput);
shotButton.setText("Shoot!");
shotButton.setMaximumSize(new java.awt.Dimension(90, 30));
shotButton.setMinimumSize(new java.awt.Dimension(90, 30));
shotButton.setName("shotButton"); // NOI18N
shotButton.setPreferredSize(new java.awt.Dimension(90, 30));
shotButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
shotButtonActionPerformed(evt);
}
});
comandPanel.add(shotButton);
shotButton.getAccessibleContext().setAccessibleDescription("Spara co il cannone");
fileMenu.setText("File");
newItemMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F2, 0));
newItemMenu.setText("New Game");
fileMenu.add(newItemMenu);
fileMenu.add(fileJSeparator);
exitItemMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.SHIFT_MASK));
exitItemMenu.setText("Exit");
exitItemMenu.setToolTipText("Esce dal Gioco");
exitItemMenu.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
exitItemMenuMouseClicked(evt);
}
});
fileMenu.add(exitItemMenu);
topMenu.add(fileMenu);
viewMenu.setText("View");
highScoreItemMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.event.InputEvent.SHIFT_MASK));
highScoreItemMenu.setText("High Score");
viewMenu.add(highScoreItemMenu);
viewInstructionItemMenu.setText("Instructions");
viewMenu.add(viewInstructionItemMenu);
viewShoutcutItemMenu.setText("Keyboard Shoutcut");
viewMenu.add(viewShoutcutItemMenu);
topMenu.add(viewMenu);
impostMenu.setText("Settings");
gameVAriablesItemMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I, java.awt.event.InputEvent.SHIFT_MASK));
gameVAriablesItemMenu.setText("Game Variables");
impostMenu.add(gameVAriablesItemMenu);
impostUserItemMEnu.setText("User Name");
impostMenu.add(impostUserItemMEnu);
topMenu.add(impostMenu);
setJMenuBar(topMenu);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, animationPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(comandPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 760, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(animationPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 443, Short.MAX_VALUE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(comandPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 73, Short.MAX_VALUE)
.add(20, 20, 20))
);
comandPanel.getAccessibleContext().setAccessibleDescription("PannelloDeiComandi");
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-800)/2, (screenSize.height-600)/2, 800, 600);
}// </editor-fold>
private void exitItemMenuMouseClicked(java.awt.event.MouseEvent evt) {
System.exit(0);
}
private void shotButtonActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GraphicX().setVisible(true);
}
});
}
private Image img = ImageIO.read(new File ("./Cannoncino.gif"));
private ImagePanel cannonPane = new ImagePanel(img);
// Variables declaration - do not modify
private javax.swing.JLabel DELETE;
private javax.swing.JPopupMenu DESTROY;
private javax.swing.JLabel alzoLabel;
private javax.swing.JSlider angleSlider;
private javax.swing.JPanel animationPanel;
private javax.swing.JPanel comandPanel;
private javax.swing.JMenuItem exitItemMenu;
private javax.swing.JSeparator fileJSeparator;
private javax.swing.JMenu fileMenu;
private javax.swing.JMenuItem gameVAriablesItemMenu;
private javax.swing.JMenuItem highScoreItemMenu;
private javax.swing.JPanel imagePanelRotate;
private javax.swing.JMenu impostMenu;
private javax.swing.JMenuItem impostUserItemMEnu;
private javax.swing.JMenuItem newItemMenu;
private javax.swing.JButton shotButton;
public javax.swing.JTextField shotsInput;
private javax.swing.JLabel shotsLabel;
public javax.swing.JTextField speedInput;
private javax.swing.JLabel speedLabel;
private javax.swing.JMenuBar topMenu;
private javax.swing.JMenuItem viewInstructionItemMenu;
private javax.swing.JMenu viewMenu;
private javax.swing.JMenuItem viewShoutcutItemMenu;
// End of variables declaration
}
//____________________________________
// ImagePanel.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package hittheplane;
import java.awt.*;
import javax.swing.JPanel;
@SuppressWarnings("serial")
class ImagePanel extends JPanel
{
private Image img;
private double angle;
public ImagePanel (Image img)
{
this.img = img;
}
public void setAngle (double angle)
{
this.angle = Math.toRadians (angle);
repaint ();
}
@Override
public void paintComponent (Graphics g)
{
super.paintComponent (g);
Graphics2D g2d = (Graphics2D) g;
int panelWidth = getWidth ();
int panelHeight = getHeight ();
int imgWidth = img.getWidth (this);
int imgHeight = img.getHeight (this);
g2d.translate (panelWidth/2, panelHeight/2);
g2d.rotate (angle);
g2d.drawImage (img, -imgWidth/2, -imgHeight/2, this);
}
}
Ma mi da due errori:
init:
deps-jar:
Compiling 2 source files to /*censured path*/HitThePlae/build/classes
/*censured path*/HitThePlae/src/hittheplane/GraphicX.java:108: cannot find symbol
symbol : method setAngle(int)
location: class javax.swing.JPanel
imagePanelRotate.setAngle (angleSlider.getValue ());
1 errors
BUILD FAILED (total time: 0 seconds)
Ora.. Io mi sono ltto un po' tutto il codice... Ma non capisco xke mi dice che Image è astratto e non lo posso usare???? Image l'o usato ancora.. non mi ha mai dato questo problema.... o.0
Sarò stupido io?????
EDIT: HO RISOLTO IL PROBLEMA DI Image ERA UN ERRORE STUPIDO....!!
Ora mi manca l'altro problema... ç_ç/EDIT
Cmq se vi interessa allego pure il file ".form" se volete sfruttarlo con matisse per capire... (anche se voi siete dei mezzi genii.. XD e vedete il codice come se fosse visuibile.. tipo codice matrix.. XD XD :D :D )
Ecco xke odio netbeans... Con il suo initComponents() inizializza tutte le variabli.... :(
e se io ne volessi una per i cazzi mia???? GRRRR
HEEELEPPP!!!! Qlk1 può aiutarmi per sopra??
:cry: :cry:
banryu79
03-06-2008, 13:34
Guarda, basta che leggi con calma il messaggio del compilatore, di solito sono piuttosto chiari, per esempio nel caso del tuo post qui sopra:
/*censured path*/HitThePlae/src/hittheplane/GraphicX.java:108: cannot find symbol
symbol : method setAngle(int)
location: class javax.swing.JPanel
imagePanelRotate.setAngle (angleSlider.getValue ());
Evidentemente angleSlider.getValue() torna un int e l'oggetto referenziato da imagePanelRotate, che è la tua classe ImagePanel che estende javax.swing.JPanel, non ha un metodo setAngle(int) cioè che accetta interi.
Infatti se vado a leggere nella classe ImagePanel trovo "solo" un metodo setAngle(double angle) che quindi accetta solo double.
Una soluzione sarebbe castare a double, così: ((double) angleSlider.getValue())
Un'altra soluzione, per me più elegante, sarebbe definire in ImagePanel un altro metodo setAngle() che accetta double.
Comunque ti consiglio di sforzarti a leggere e tentare di capire da solo i messaggi di errore di javac.
Ciao :)
eh, mi ero accorto dell'int e del double.....
Il problema è che.. fatto il cast a double... Da ancora errore......
Creata una variabile di supporto che trafsorma l'int in double... errore..
usato un wrapper Integer che poi viene trasformato in double.... Ma nulla..
Sempre errore.... Non è il fatto che la funizone accetti un double... Pensavo anche io...... ç_ç
EDIT
Bello, se lo faccio girare sotto Eclipse mi da questo "errorino".. XD
:D ma perchè uso due IDE differenti.. :( :(
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems:
org.jdesktop cannot be resolved to a type
org.jdesktop cannot be resolved to a type
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved to a type
org.jdesktop cannot be resolved to a type
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved to a type
org.jdesktop cannot be resolved to a type
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
org.jdesktop cannot be resolved
at GraphicX.initComponents(GraphicX.java:89)
at GraphicX.<init>(GraphicX.java:24)
at GraphicX$2.run(GraphicX.java:250)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Ora devo scappare... Apena torno a casa mi studio bene che sta succedendo.. :cry: :muro:
Spero di cavarci qlke cosa... ç_ç
banryu79
03-06-2008, 14:18
eh, mi ero accorto dell'int e del double.....
Il problema è che.. fatto il cast a double... Da ancora errore......
Creata una variabile di supporto che trafsorma l'int in double... errore..
usato un wrapper Integer che poi viene trasformato in double.... Ma nulla..
Sempre errore.... Non è il fatto che la funizone accetti un double... Pensavo anche io...... ç_ç
Scusa se te lo dico, ma potresti cercare di essere più preciso?
Con tutta la buona volontà del mondo mi dici come possiamo aiutarti a risolvere il tuo problema avendo come unica fonte di informazione quello che scrivi nei tuoi post, se non ci scrivi il benedetto messaggio di errore? :sofico:
Posta le lamentele di javac che vediamo un po' dove sta l'inghippo :)
banryu79
03-06-2008, 14:26
Vabbè adesso anche il discorso Eclipse... li l'errore mi sembra dovuto al fatto che stai usando classi di librerie esterne e forse nella fretta non hai segnalato a Eclipse che in questo progetto stai usando la tale libreria il cui jar è sito in tal'altro posto nel tuo pc.
Però se posso permettermi, invece di agitarti e fare mille prove fermati un attimo e con calma risolviamo il problema.
Torna sotto NetBeans, controlla il codice, compila e posta l'errore.
Evidentemente angleSlider.getValue() torna un int e l'oggetto referenziato da imagePanelRotate, che è la tua classe ImagePanel che estende javax.swing.JPanel, non ha un metodo setAngle(int) cioè che accetta interi.
Infatti se vado a leggere nella classe ImagePanel trovo "solo" un metodo setAngle(double angle) che quindi accetta solo double.No il problema non è quello! Anche perché un int è implicitamente convertibile a double ... ed è proprio quello che facevo io nel mio esempio: passavo un int a setAngle().
Il problema lo spiega molto bene il messaggio di errore:
/*censured path*/HitThePlae/src/hittheplane/GraphicX.java:108: cannot find symbol
symbol : method setAngle(int)
location: class javax.swing.JPanel
imagePanelRotate.setAngle (angleSlider.getValue ());
Infatti la variabile di istanza è un JPanel
private javax.swing.JPanel imagePanelRotate;
Quindi è chiaro che sul reference imagePanelRotate non si può invocare un setAngle() perché JPanel non ce l'ha!!
banryu79
03-06-2008, 16:37
Ciao Andbin,
anche io all'inizio avevo pensato a questo ma poi sono andato a controllare il codice che ha postato e, scusa l'ignoranza mia, perchè il compilatore lo vede come un JPanel?
Lui da codice fa così:
...
imagePanelRotate = new ImagePanel(img1);
...
Quindi quella reference dovrebbe puntare a un'istanza ImagePanel, che:
...
class ImagePanel extends JPanel
{
private Image img;
private double angle;
public ImagePanel (Image img)
{
this.img = img;
}
public void setAngle (double angle)
{
this.angle = Math.toRadians (angle);
repaint ();
}
public void paintComponent (Graphics g)
{
super.paintComponent (g);
Graphics2D g2d = (Graphics2D) g;
int panelWidth = getWidth ();
int panelHeight = getHeight ();
int imgWidth = img.getWidth (this);
int imgHeight = img.getHeight (this);
g2d.translate (panelWidth/2, panelHeight/2);
g2d.rotate (angle);
g2d.drawImage (img, -imgWidth/2, -imgHeight/2, this);
}
}
Ehm, non vorrei dire cavolate ma non potrebbe essere che il problema è dato dal fatto che la classe che estende JPanel non è dichiarata come pubblica e non è in un file .java per i cavoli suoi?
anche io all'inizio avevo pensato a questo ma poi sono andato a controllare il codice che ha postato e, scusa l'ignoranza mia, perchè il compilatore lo vede come un JPanel?Perché la scelta della signature del metodo da invocare viene fatta a tempo di compilazione basandosi solo ed esclusivamente sul tipo del reference. È poi a runtime che viene scelta la implementazione da eseguire in base all'oggetto realmente istanziato.
Lui da codice fa così:
...
imagePanelRotate = new ImagePanel(img1);
...
Quindi quella reference dovrebbe puntare a un'istanza ImagePanelSu questo, ok. Ma non è questo che conta per stabilire quali sono i metodi invocabili. Conta il tipo del reference ... della variabile che hai sottomano.
Esempio:
Object obj = new Date();
Object definisce toString() (quindi è noto ad Object) e la classe Date ne fa l'override, quindi posso invocare obj.toString() e verrà eseguita la implementazione di toString() di Date piuttosto che quella di Object.
Se il reference è di tipo Object però non posso invocare ad esempio getTime(), perché Object non sa nulla di questo metodo. È della classe Date.
Quindi, per ripetere, è il tipo del reference che determina quali sono i metodi invocabili. È invece l'oggetto realmente istanziato che determina la implementazione che verrà eseguita.
Questa è una questione i-m-p-o-r-t-a-n-t-i-s-s-i-m-a, fondamentale in Java e in altri linguaggi ad oggetti.
Ehm, non vorrei dire cavolate ma non potrebbe essere che il problema è dato dal fatto che la classe che estende JPanel non è dichiarata come pubblica e non è in un file .java per i cavoli suoi?No.
banryu79
04-06-2008, 08:21
Sì Andbin, grazie della spiegazione ma ho fatto confusione perchè invece di accorgermi di questo:
imagePanelRotate = new ImagePanel(img1);
...
private javax.swing.JPanel imagePanelRotate;
continuavo a guardare il codice nel tuo post:
private ImagePanel imagePanel;
...
imagePanel = new ImagePanel (img);
Ero così intento a leggere rapidamente e controllare la coerenza dei tipi istanziati che nella fretta non mi sono accorto di stare a guardare del codice che non era esattamente quello usato da jj.69kt ne che il nome della reference non era quello giusto :stordita:
Grazie comunque delle spiegazioni :)
AAH!! Ho capito quel'è il problema!!! Il fatto è che NetSchif non m permette di modificare il tipo... Cioè, io lo edito nel file con un semplice TextEdit poi appena lo apro in NB me lo "corregge"...... E di conseguenza non trova setAngle()...
Avete in mente una soluzione? (Nel frattempo io o provato un decina di sistemi.. ç_ç ma nulla... :cry: :muro: )
AH, Comunque mille graziie!!!! Siete gentilissimi, sto imparando molo piu su questo forum k a lezione.. :D :D
banryu79
04-06-2008, 12:58
AAH!! Ho capito quel'è il problema!!! Il fatto è che NetSchif non m permette di modificare il tipo...
... :confused:
Cioè, io lo edito nel file con un semplice TextEdit poi appena lo apro in NB me lo "corregge"...... E di conseguenza non trova setAngle()...
:eekk:
Ecco perchè! NetSchif come lo chiami tu (:nonsifa:) non si usa così, è un IDE non un semplice editor di testo... mio dio!
Guarda, se osi storpiare un'altra volta il nome del mio amato NetBeans io mi eclisso ad vitam dai tuoi thread (:asd: )
Senti, ho capito poco e male come lo usi in modo "ibrido" con il tuo editor di testo esterno: ma lavorare solo da dentro l'IDE no?
Quale sarebbe il motivo che ti ha spinto a lavorare così?
Comunque per aggiungere una, chiamiamola, "classe visuale" che estenda JPanel in modo che tu poi ci possa implementare quello che ti pare è sufficiente, da NetBeans, cliccare col tasto destro sopra il nome del package dentro cui vuoi aggiungere la classe, scegliere New... -> JPanel Form et voilà:
ti compare una bella dialog, imposti il nome che vuoi dare alla tua classe e confermi con OK.
Il gioco è fatto: in NetBeans ti ritrovi con 2 viste della classe: una è la vista fornita dall'editor del codice, l'altra la vista fornita dall'editor visuale di NetBeans, il buon Matisse, che ti permette di aggiungere/modificare componenti con un interfaccia WYSIWYG (What You See Is What You Get).
Ora, nella vista dell'editor di codice della classe puoi fare quello che ti pare, l'unica cosa particolare è che ti troverai dei blocchi di codice "controllati" da NetBeans, e sono le parti di codice generate ET gestite completamente in automatico da Matisse sulla base delle informazioni contenute nell'editor grafico! Tu su quello devi agire per modificare la parte grafica.
Inoltre è sempre possibile customizzare praticamente tutto quello che Matisse ha fatto anche se non puoi cambiare di una virgola il codice che genera/gestisce lui in automatico: il trucco è aggiungere del tuo codice, fuori dai blocchi gestiti da Matisse, per maniopolare le stesse variabili create dall'editor.
In nessun caso puoi aspettarti di modificare (tramite un editor esterno) il codice gestito da Matisse, salvare il file .java e riaprilo in NetBeans sperando che le modifiche così apportate siano mantenute.
Questo perchè quando NetBeans crea una "classe visuale" (cioè con la vista sia del codice sorgente che delle componenti grafiche) viene generato sì un file .java, ma viene anche associato un corrispondente file .form che in pratica gestisce la parte riguardante i setting grafici dei componenti così come specificato in Matisse e li salva: sono questi dati che vengono consultati per rigenerare la parte di codice "guarded" nel corrispettivo file .java
Avete in mente una soluzione?Sì una soluzione c'è .... ma devo dirla in modo un po' brusco: evita come la peste di farti generare il codice dal tuo ambiente di sviluppo. Il codice è bene scriverlo tutto a mano, compresa tutta la parte relativa alla creazione della interfaccia utente.
Personalmente sono contrario al software che ti scrive il codice mentre invece sostengo che sia fondamentale conoscere bene (e ripeto *bene*) i componenti e i layout manager AWT/Swing se si vogliono realizzare delle applicazioni serie.
Mhm, nulla in particolare contro NetBean..
Solo che io detesto i programmi che generano il codice in automatico.. L'unico motivo per cui non faccio tutto in u editor solo testuale è c non ne o ancora le capacità.... E il progetto devo consegnarlo al piu presto (massimo fine mese), non bastasse sono in un gruppo in cui.. beh... sorvoliamo...
Per cui mi trovo a dover utilizzare degli IDE che mi aiutino...
Tra l'altro sono anche assai in dietro....
Cmq ora provo la soluzione gentilmente suggeritami...
Vi faccio sapere a breve..
..ancora grazie!
EDIT:
Ok, sarò ardo io... Io la classe ImagePanel l'ho creata.. Ora il problema è... ome aggiungo un oggetto ImagePanel in matisse nell'altro file? (ovvero GraphicX)
Se agiungo un panel in automatico mi mette un JPanel (ovviamente, km'è giusto k sia..)
Ma se io volessi un ImagePanel???????
:read:
Mhm ora sto facendo un class digram... Ma no o ancora risolto con la storia del ImagePanel..
O meglio.. posso inserirlo manualmente ma non me lo mostra nella sezione "Design".. E per ciò è un po inutile.. :D (visto k vorrei manipolarlo.. sigh..)
banryu79
05-06-2008, 13:18
:read:
Mhm ora sto facendo un class digram... Ma no o ancora risolto con la storia del ImagePanel..
O meglio.. posso inserirlo manualmente ma non me lo mostra nella sezione "Design".. E per ciò è un po inutile.. :D (visto k vorrei manipolarlo.. sigh..)
Leggi qua:
Comunque per aggiungere una, chiamiamola, "classe visuale" che estenda JPanel in modo che tu poi ci possa implementare quello che ti pare è sufficiente, da NetBeans, cliccare col tasto destro sopra il nome del package dentro cui vuoi aggiungere la classe, scegliere New... -> JPanel Form et voilà:
ti compare una bella dialog, imposti il nome che vuoi dare alla tua classe e confermi con OK.
In pratica devi crearti una classe a parte, nel modo in cui ho spiegato sopra, in questa maniera NetBeans ti presenterà anche la vista tramite editor visuale.
Per motivi pratici fingiamo che chiami questa classe "CustomPanel"
Poi per aggiungerla nella classe che rappresenta il "Frame" dove inserisci i tuoi componenti devi:
> aggiungere alla classe "Frame", tramite l'editor grafico, nel punto in cui vuoi inserire il tuo "CustomPanel", un normale JPanel a cui setterai la proprietà PreferredSize uguale alla PreferredSize del tuo "CustomPanel" e a cui rimuoverai i bordi (proprietà Border settata a NoBorder).
A questi settings [proprietà] accedi tramite il pannello Proprietà.
Inoltre assicurati che il LayoutManager di questo JPanel sia settato a BorderLayout; se così non fosse lo puoi impostare tramite click destro sul JPanel, scegli SetLayout, BorderLayout.
> nel costruttore della classe "Frame", dopo il metodo generato da NetBeans initComponents(), crei un'istanza della tua classe "CustomPanel" e la inserisci nel JPanel del punto precedente utilizzando il nome della variabile che lo rappresenta [lo vedi nell'editor grafico cliccando sul JPanel per selezionarlo ed esaminando il pannello "Inspector"] su cui invocherai il metodo .add() passandogli come argomento la reference a "CustomPanel" appena creata.
khelidan1980
05-06-2008, 13:57
:read:
Mhm ora sto facendo un class digram... Ma no o ancora risolto con la storia del ImagePanel..
O meglio.. posso inserirlo manualmente ma non me lo mostra nella sezione "Design".. E per ciò è un po inutile.. :D (visto k vorrei manipolarlo.. sigh..)
scusa mi permetti un osservazione,già tu dici che non ti piacciono gli ide che generano codice in automatico,hai passato due e passa giorni a tentar di far fare a Netbeans una cosa che non può fare,non facevi prima a prenderti un libro e a guardarti un po di cose su swing o awt?Non credo proprio che il target principale del tuo progetto sia la creazione dell'interfaccia più fica che ci sia
Guarda, se osi storpiare un'altra volta il nome del mio amato NetBeans io mi eclisso ad vitam dai tuoi thread (:asd: )
Ecco fai bene a eclipsarti va!! :sofico:
Leggi qua:
In pratica devi crearti una classe a parte, nel modo in cui ho spiegato sopra, in questa maniera NetBeans ti presenterà anche la vista tramite editor visuale.
Per motivi pratici fingiamo che chiami questa classe "CustomPanel"
Poi per aggiungerla nella classe che rappresenta il "Frame" dove inserisci i tuoi componenti devi:
> aggiungere alla classe "Frame", tramite l'editor grafico, nel punto in cui vuoi inserire il tuo "CustomPanel", un normale JPanel a cui setterai la proprietà PreferredSize uguale alla PreferredSize del tuo "CustomPanel" e a cui rimuoverai i bordi (proprietà Border settata a NoBorder).
A questi settings [proprietà] accedi tramite il pannello Proprietà.
Inoltre assicurati che il LayoutManager di questo JPanel sia settato a BorderLayout; se così non fosse lo puoi impostare tramite click destro sul JPanel, scegli SetLayout, BorderLayout.
> nel costruttore della classe "Frame", dopo il metodo generato da NetBeans initComponents(), crei un'istanza della tua classe "CustomPanel" e la inserisci nel JPanel del punto precedente utilizzando il nome della variabile che lo rappresenta [lo vedi nell'editor grafico cliccando sul JPanel per selezionarlo ed esaminando il pannello "Inspector"] su cui invocherai il metodo .add() passandogli come argomento la reference a "CustomPanel" appena creata.
Scusa.... Magari mi sbaglio, ma in questo modo non imposto due volte la reference dell'ogetto che creo? Intendo se nel metodo initComponents() l'oggetto pannelloCustom viene inizializzato come java.swing.JPanel e io poi lo re-inizializzo di nuovo come CustomPanel... Non gli "da fastidio"??
@ khelidan1980
Beh, si non adoro gli IDE integrati.. Per praticità però li uso (anche se tento in cmq leggendo il sorgente k creano di capire cosa fanno....)... Certo il progetto non richiede di fare un interfaccia figa... Però... Alla fine è più comodo.. Ed in ogni caso non ho fatto solo quello in questi giorni.. Sono andato avanti con altre cose...
Quando sarò piu brav il mio obbiettivo è abbandonare NetBeans... Per ora.. Non sono ancora abbastanza ferrato.. :P
khelidan1980
05-06-2008, 14:12
@ khelidan1980
Beh, si non adoro gli IDE integrati.. Per praticità però li uso (anche se tento in cmq leggendo il sorgente k creano di capire cosa fanno....)... Certo il progetto non richiede di fare un interfaccia figa... Però... Alla fine è più comodo.. Ed in ogni caso non ho fatto solo quello in questi giorni.. Sono andato avanti con altre cose...
Quando sarò piu brav il mio obbiettivo è abbandonare NetBeans... Per ora.. Non sono ancora abbastanza ferrato.. :P
intendevo che forse dovresti valutare meglio dove "perder tempo" tipo sulle classi che calcolano la fisica delle traettorie! ;)
E comunque puoi non adorare gli editor visuali integrati ma gli ide....fra un po adorerai chi ha inventato eclipse o nb! :D
banryu79
05-06-2008, 15:24
...
hai passato due e passa giorni a tentar di far fare a Netbeans una cosa che non può fare
...
Questo lo dici tu, la cosa che ho spiegato sopra nel post funziona benissimo e NetBeans la gestisce senza problemi.
Certo imparare a gestire tutto direttamente senza IDE intermediari sarebbe molto meglio, come diceva anche Andbin, e se arrivi a quel livello (cioè conoscenza intima di Swing e Awt con tutto quello che c'è da sapere) poi sei tranquillo e puoi concepire e realizzare interfacce sicuramente degne di questo nome.
Però prima devi conquistartela questa conoscenza e non è cosa che si ottiene in termini temporali brevi; al contrario l'utente del thread mi pare abbia una certa urgenza e nel breve termine imparare ad utilizzare gli strumetti che un IDE mette a disposizione mi sembra positivo.
Questo però significa essere sempre coscienti di essere "legati" con l'IDE per quanto riguarda l'interfaccia: sarà bene quindi tenere conti di questo fattore e mettere in preventivo delle porzioni del proprio tempo di studio per approfondire la conoscenza di Swing e Awt.
Comunque, per utilizzare l'editor visuale con cognizione di causa, è implicita una certa conoscenza degli strumenti che vengono usati altrimenti molte cose restano "oscure" in ogni caso.
Ecco fai bene a eclipsarti va!! :sofico:
:eek: ... :p
Scusa.... Magari mi sbaglio, ma in questo modo non imposto due volte la reference dell'ogetto che creo? Intendo se nel metodo initComponents() l'oggetto pannelloCustom viene inizializzato come java.swing.JPanel e io poi lo re-inizializzo di nuovo come CustomPanel... Non gli "da fastidio"??
Forse non sono stato chiaro io o forse ti è sfuggito qualche passaggio.
Abbiamo due classi "visuali":
> class "MioFrame", è la finestra della tua applicazione dove all'interno inserisci i tuoi componenti grafici.
> class "CustomPanel", è la tua classe che estende JPanel (sta in un file per i fatti suoi e non c'entra con "MioFrame", per ora).
Dentro "MioFrame" ci saranno vari componenti, per esempio:
2 JPanel che ti dividono l'area client del Frame in due diverse porzioni: una grande "sopra" e una piccola "sotto".
Supponiamo che il JPanel della porzione che sta "sotto" venga usato come area dove metti i tuoi bottoni, le label e quant'altro per gestire l'input utente (per esempio i setting dei parametri di angolo di tiro e numero colpi per salva del cannone).
Naturalmente per raggruppare e presentare in maniera ordinata e logica i tuoi controlli puoi suddividere ulteriormente questo pannello con altri pannelli che gli stanno dentro; alla fine dentro a questi pannelli metterai i tuoi controlli (è solo un esempio per capire il ragionamento).
Il Jpanel "sopra" invece per il momento lo tieni vuoto ed è la zona della finestra destinata al rendering grafico del gioco.
Tutto questo, abbiamo detto, avviene nella classe visuale "MioFrame".
A questo punto tu crei un'altra classe con il metodo che ti ho descritto nel mio post precedente (dentro al quote) che chiamiamo "CustomPanel".
Facciamo che hai creato anche questa classe.
Ora, in sostanza, in "MioFrame" avrai una variabile, creata in automatico da NetBeans, per ogni componente grafica che hai inserito tramite l'editor.
Quindi, nel nostro esempio esisteranno due variabili di tipo JPanel: una è il JPanel "sopra", quello vuoto, e l'altra è il JPanel "sotto", quello con dentro i bottoni e gli altri componenti.
Facciamo finta che la variabile del JPanel che sta "sopra" NetBeans l'abbia dichiarata così: "javax.swing.JPanel pannelloSopra".
Nel costruttore di "MioFrame" NetBeans avrà iniettato il metodo initComponents() che crea e setta i componenti così come tu li hai specificati tramite editor grafico.
Nota che fin'ora la classe "CustomPanel" non è ancora entrata in gioco... ed entra in gioco adesso:
1) nelle variabili di "Mio Frame" tu aggiungi la dichiarazione di una variabile di tipo CustomPanel, per esempio:
private CustomPanel customPanel;
2) nel costruttore di "MioFrame", dopo initComponents(), crei un nuovo CutomPanel e lu aggiungi dentro a "pannelloSopra".
/**
*Creates new form MioFrame
*/
public MioFrame()
{
initComponents();
customPanel= new CustomPanel();
pannelloSopra.add(customPanel);
}
Ok, spero che adesso sia più chiaro...
khelidan1980
05-06-2008, 15:27
Questo lo dici tu, la cosa che ho spiegato sopra nel post funziona benissimo e NetBeans la gestisce senza problemi.
No aspe,io mi riferivo al fatto che avete spiegato( io netbeans non lo conosco) che lui tentatava di modificare il codice prodotto da matisse a mano e poi di conseguenza ogni volta che lo ricaricava perdeva queste modifiche
Comunque avevo dato anche per scontato che se un prof da un progetto del genere almeno un po di pratica con swing nel corso l'avessero fatta,forse ho presunto male! :p
intendevo che forse dovresti valutare meglio dove "perder tempo" tipo sulle classi che calcolano la fisica delle traettorie! ;)
E comunque puoi non adorare gli editor visuali integrati ma gli ide....fra un po adorerai chi ha inventato [b]eclipse[7b]! :D
questo già lo faccio.. :D
Si, gli IDE son comodi.. se nn troppo invasivi.... (tipo NB.. è carino.. ma troppo invasivo.. decisamente troppo)
No aspe,io mi riferivo al fatto che avete spiegato( io netbeans non lo conosco) che lui tentatava di modificare il codice prodotto da matisse a mano e poi di conseguenza ogni volta che lo ricaricava perdeva queste modifiche
Qllo l'ho ftto una volta... poi mi son accorto k nn funzionava.. mica so ksi pirla.. da sbattere contro un muro ripetute volte.. :D
Comunque avevo dato anche per scontato che se un prof da un progetto del genere almeno un po di pratica con swing nel corso l'avessero fatta,forse ho presunto male! :p
Un po l'abbiamo fatta.. ma molto in fretta.. piu ch altro spiegava in fretta a lezione.. :P
E mi sono perso qlke passaggio ogni tanto... :D
---------------------------------------------------------------------
l'utente del thread mi pare abbia una certa urgenza e nel breve termine imparare ad utilizzare gli strumetti che un IDE mette a disposizione mi sembra positivo.
Fine mese rulez! :D :D :muro: :muro:
Forse non sono stato chiaro io o forse ti è sfuggito qualche passaggio.
Abbiamo due classi "visuali":
> class "MioFrame", è la finestra della tua applicazione dove all'interno inserisci i tuoi componenti grafici.
> class "CustomPanel", è la tua classe che estende JPanel (sta in un file per i fatti suoi e non c'entra con "MioFrame", per ora).
E in qui avevo capito.. ;)
Dentro "MioFrame" ci saranno vari componenti, per esempio:
2 JPanel che ti dividono l'area client del Frame in due diverse porzioni: una grande "sopra" e una piccola "sotto".
Supponiamo che il JPanel della porzione che sta "sotto" venga usato come area dove metti i tuoi bottoni, le label e quant'altro per gestire l'input utente (per esempio i setting dei parametri di angolo di tiro e numero colpi per salva del cannone).
Naturalmente per raggruppare e presentare in maniera ordinata e logica i tuoi controlli puoi suddividere ulteriormente questo pannello con altri pannelli che gli stanno dentro; alla fine dentro a questi pannelli metterai i tuoi controlli (è solo un esempio per capire il ragionamento).
Il Jpanel "sopra" invece per il momento lo tieni vuoto ed è la zona della finestra destinata al rendering grafico del gioco.
è esattamente ciò che ho fatto.. :D :D
Anche se ho messo piu controlli nello stesso pannello....
O_O
X caso è un problema? :dubbioso:
Tutto questo, abbiamo detto, avviene nella classe visuale "MioFrame".
A questo punto tu crei un'altra classe con il metodo che ti ho descritto nel mio post precedente (dentro al quote) che chiamiamo "CustomPanel".
Facciamo che hai creato anche questa classe.
Ora, in sostanza, in "MioFrame" avrai una variabile, creata in automatico da NetBeans, per ogni componente grafica che hai inserito tramite l'editor.
Quindi, nel nostro esempio esisteranno due variabili di tipo JPanel: una è il JPanel "sopra", quello vuoto, e l'altra è il JPanel "sotto", quello con dentro i bottoni e gli altri componenti.
Facciamo finta che la variabile del JPanel che sta "sopra" NetBeans l'abbia dichiarata così: "javax.swing.JPanel pannelloSopra".
Nel costruttore di "MioFrame" NetBeans avrà iniettato il metodo initComponents() che crea e setta i componenti così come tu li hai specificati tramite editor grafico.
E qui siamo d'accordo.. l'unica differenza è il nome del JPanel.. :D :D :D :D
pannelloAnimazione :sofico:
Nota che fin'ora la classe "CustomPanel" non è ancora entrata in gioco... ed entra in gioco adesso:
1) nelle variabili di "Mio Frame" tu aggiungi la dichiarazione di una variabile di tipo CustomPanel, per esempio:
private CustomPanel customPanel;
2) nel costruttore di "MioFrame", dopo initComponents(), crei un nuovo CutomPanel e lu aggiungi dentro a "pannelloSopra".
/**
*Creates new form MioFrame
*/
public MioFrame()
{
initComponents();
customPanel= new CustomPanel();
pannelloSopra.add(customPanel);
}
Ok, spero che adesso sia più chiaro...
Chiarissimo! Ora provo! Comunque ho capito diverso prima...
Ti spiego, avevo capito di creare un JPanel dall'editor grafico e poi reinizializzare la variabile del JPanel creato in modo da identificarla come CustomPanel... E nn mi convinceva la cosa.. :D
Unico dettaglio... Ma la customPanel (l'oggetto non la classe) come faccio a metterlo secondo il LayoutManager che uso (ovvero FreeDesign che da quel ce ho capito è un Layout creato da Matisse ad-hoc)??
Tipo a me dovrebbe stare nell'angolo in fondo a sinistra coordinate(0, pannelloAnimazione.getHeight())
E' sufficente dirlo in quel modo? senza passare per il layoutmanager?
EDIT:
non ci va anche il "panel.setVisible(true);"?
(ora mi infamano d parole....)
Allora... Io ho atto km mi hai detto...
Bene tutto... Peccato che non mostra l'immagine... La scarica dal web.. (xke mi chiede al firewall di connettersi che gli da l'ok ma me lo notifica)
Ma non la mostra....
Ho fatto qlke prova... http://d01.megashares.com/?d01=3469952
Qsto è il risultato (non posto tutto il codice.. ho messo il link ai files sennò è lunghissimo. :D)
Sì una soluzione c'è .... ma devo dirla in modo un po' brusco: evita come la peste di farti generare il codice dal tuo ambiente di sviluppo. Il codice è bene scriverlo tutto a mano, compresa tutta la parte relativa alla creazione della interfaccia utente.
Personalmente sono contrario al software che ti scrive il codice mentre invece sostengo che sia fondamentale conoscere bene (e ripeto *bene*) i componenti e i layout manager AWT/Swing se si vogliono realizzare delle applicazioni serie.
Io sono d'accordo con te. Del resto il problema è che un buon libro per AWT risale ai tempi del JDK 1.1 ... Da quando Swing è diventato il toolkit di scelta, sembra che AWT sia passato in secondo piano. Eppure una comprensione come si deve di AWT è ancora necessaria. E non è che AWT non sia piu' attivamente sviluppato... Tutt'altro... In fondo è sempre la base di Swing
Lo stesso discorso si applica pari pari alla Java Native Interface... Troppo bistrattata per i miei gusti, quando invece possiamo trovare tutti i libri che vogliamo per CLI, parlando di .NET
Mi sta un po sui maroni sta cosa.
banryu79
06-06-2008, 08:54
è esattamente ciò che ho fatto.. :D :D
Anche se ho messo piu controlli nello stesso pannello....
O_O
X caso è un problema? :dubbioso:
No, non è un problema.
La strategia di suddividere un pannello con altri pannelli al suo interno dentro cui poi piazzerai i tuoi componenti è utile se devi appunto gestire diverse aree dentro lo stesso pannello con diversi LayoutManager.
Certo uno deve:
A) sapere cosa sta facendo;
B) conoscere gli strumenti;
C) sapere come utlilizzare gli strumenti;
Il discorso di sapere gestire il codice a mano e imparare bene AWT lo sottoscrivo anch'io.
Il fatto di utilizzare un IDE come NetBeans che mette a disposizione un editor grafico (e quindi un generatore di codice) non implica l'ignoranza della libreria AWT e/o Swing, secondo me, al contrario implica oltre questa conoscenza anche quella nell'utilizzo di questo strumento e di come esso si comporti.
Certo che uno se si abitua a un generatore di codice può, la volta che si trova senza, restare spiazzato oppure non approfondire mai certi concetti perchè "mascherati" dall'editor grafico e prendere così una brutta abitudine: questo però, come (quasi) sempre, dipende dall'utilizzatore dell'utensile e non dall'utensile che invece è piuttosto utile (imho).
Unico dettaglio... Ma la customPanel (l'oggetto non la classe) come faccio a metterlo secondo il LayoutManager che uso (ovvero FreeDesign che da quel che ho capito è un Layout creato da Matisse ad-hoc)??
Temo di non aver capito bene.
Non capisco se mi stai chiedendo come fare per settare il LayoutManager dell'istanza di "CustomPanel" creata in "MioFrame", oppure se mi stai chiedendo come gestire il posizionamento dell'istanza di "CustomPanel" dentro "MioFrame" tramite il LayoutManager del JPanel in "MioFrame" che lo conterrà?
O forse stai chiedendo tutt'altro e non ho capito una cippa?
Tipo a me dovrebbe stare nell'angolo in fondo a sinistra coordinate(0, pannelloAnimazione.getHeight())
E' sufficente dirlo in quel modo? senza passare per il layoutmanager?
Ecco, qui temo ci sia un po' di confusione.
Fammi capire, tu vorresti posizionare visivamente il "CustomPanel" nell'angolo in basso a sinistra dell'istanza chiamata "panelloAnimazione"?
Se sì forse ho capito l'intoppo:
il JPanel la cui istanza è "pannelloAnimazione" che LayoutManager ha?
Perchè ti avevo già scritto questo:
> aggiungere alla classe "Frame", tramite l'editor grafico, nel punto in cui vuoi inserire il tuo "CustomPanel", un normale JPanel [sarebbe la tua istanza "pannelloAnimazione"] a cui setterai la proprietà PreferredSize uguale alla PreferredSize del tuo "CustomPanel" e a cui rimuoverai i bordi (proprietà Border settata a NoBorder).
A questi settings [proprietà] accedi tramite il pannello Proprietà.
Inoltre assicurati che il LayoutManager di questo JPanel sia settato a BorderLayout; se così non fosse lo puoi impostare tramite click destro sul JPanel, scegli SetLayout, BorderLayout.
Ecco, qui temo ci sia un po' di confusione.
Fammi capire, tu vorresti posizionare visivamente il "CustomPanel" nell'angolo in basso a sinistra dell'istanza chiamata "panelloAnimazione"?
Precisamente!
Se sì forse ho capito l'intoppo:
il JPanel la cui istanza è "pannelloAnimazione" che LayoutManager ha?
Perchè ti avevo già scritto questo:
> aggiungere alla classe "Frame", tramite l'editor grafico, nel punto in cui vuoi inserire il tuo "CustomPanel", un normale JPanel [sarebbe la tua istanza "pannelloAnimazione"] a cui setterai la proprietà PreferredSize uguale alla PreferredSize del tuo "CustomPanel" e a cui rimuoverai i bordi (proprietà Border settata a NoBorder).
Inoltre assicurati che il LayoutManager di questo JPanel sia settato a BorderLayout;
Mmh, un po' in ritardo a causa scarso internet..
Se io setto il border layout quello "sparisce" è normale???
Non riesco piu a trovarlo.. :P
Ti spiego km è messa la cosa:
JFrame(finestra)->{
JPanel(comandi)->{null},
JPanel(pannelloAnimazione)->{
JPanel(coustomPanel)->{}
JPanel(cousomSupport)->{}
}
}
Questo è piu o meno la rappresentazione dei miei panel e frame..
Il coustom è quello da me inserito "nel codice" mentre il coustomSupport è quello messo in Matisse con le stesse dimensioni preferite..
coustomSupport ha: noBorder, preferredSize[60, 60] (e quando imposto borderLayout "sparisce" visivamente.... O_O )
banryu79
09-06-2008, 13:57
Il coustom è quello da me inserito "nel codice" mentre il coustomSupport è quello messo in Matisse con le stesse dimensioni preferite..
coustomSupport ha: noBorder, preferredSize[60, 60] (e quando imposto borderLayout "sparisce" visivamente.... O_O )
Ciao,
ok quindi hai inserito 2 JPanel dentro al JPanel "contenitore" che si chiama "pannelloAnimazione"?
Mettine solo uno dei due: quello definito da te in un'altra classe e inserito a mano da codice, quello messo da Matisse non so che c'entri e nel mio esempio non c'era.
Per chiarezza a questo link (http://www.hwupgrade.it/forum/showthread.php?t=1734565)trovi un thread (l'argomento del thread non c'entra niente con quello che stai facendo tu) dove alla fine del primo post trovi due file allegati: scaricati "code.zip", dentro ci trovi 4 file: 2 classi "visuali" nei due file .java associati ai 2 file .form.
La classe di nome TransformWindow estende JFrame e al suo interno viene suddivisa in due aree utilizzando due JPanel:
- canvasPanel -> il JPanel [aggiunto da editor grafico] che funge da contenitore per il JPanel personalizzato il cui codice è l'altro file .java (class RendererBox)
- jPanel1 -> il JPanel [aggiunto da editor grafico] che contiene i controlli.
Guarda come viene settato/usato canvasPanel in TransformWindow per poter accogliere correttamente al suo interno un'istanza di RendererBox.
Questo illustra la tecnica che ho cercato di spiegarti fin'ora.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.