Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-10-2006, 10:41   #1
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
[JAVA] Layout ridimensionabili

Ragazzi, come faccio a fare in modo da rendere i layout ridimensionabili secondo preferenza dell'utente???

mi spiego meglio, vedete ad esempio quando aprite i preferiti su firefox....bene, se mettete il cursore sul bordo, lui cambia forma e vi permette di ridimensionare la larghezzza.

Sarebbe possibile fare una cosa del genere con i layout(tipo Border Layout)o con un qualsiasi altro layout???

se devo reimplementarne uno mio, come faccio a permettere questa operazione???
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2006, 11:28   #2
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
Intendi uno split pane?

Qui vedi come è fatto (la foto dell'astronauta):
http://java.sun.com/docs/books/tutor...omponents.html
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2006, 11:33   #3
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
Quote:
Originariamente inviato da lovaz
Intendi uno split pane?

Qui vedi come è fatto (la foto dell'astronauta):
http://java.sun.com/docs/books/tutor...omponents.html
esatto, una cosa del genere........sai come è fatto quello???
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2006, 12:31   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
I partecipanti al fattaccio sono due: il contenuto ed il suo contenitore. Il contenitore è responsabile della gestione degli eventi del mouse che determinano il ridimensionamento e il contenuto stabilisce le informazioni necessarie affinchè ridimensionamento vi sia e di quanto.

Al minimo ti serve un LayoutManager, un Container e un Component.

Ti faccio un esempio che, per pigrizia, ricicla il LayoutManager FlowLayout, con ancoraggio FlowLayout.LEFT. Il FlowLayout "va bene" perchè rispetta le dimensioni preferite del contenuto e l'ancoraggio a sinistra ti permette di lavorare sul componente disponendo di un'origine immutabile.

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

public class ResizableComponent extends JPanel {
	private Cursor plainCursor;
	private final Cursor RESIZE_CURSOR = Cursor.getPredefinedCursor(
		Cursor.W_RESIZE_CURSOR);
		
	/** Punto di ancoraggio del trascinamento. E' usato sia per calcolare la
	quantità di spostamento che per determinare se sia in corso il
	trascinamento */
	private Point dragStart;

	/** Adattatore Mouse connesso al contenitore di questo componente */
	private MouseInputAdapter mouseHook = new MouseInputAdapter() {
		/** Cambia i cursori */
		public void mouseMoved(MouseEvent e) {
			if(nearBorder(e.getPoint(), getBounds())) {
				setResizeCursor();
			} else {
				setPlainCursor();
			}
		}
		
		/** Inizia le operazioni di trascinamento */
		public void mousePressed(MouseEvent e) {
			if(nearBorder(e.getPoint(), getBounds())) {
				startResize(e.getPoint());
			}
		}
		
		/** Trascinamento: ridimensiona il componente */
		public void mouseDragged(MouseEvent e) {
			if(dragStart != null) {
				resize(e.getPoint());
			}
		}
		
		/** Ferma le operazioni di trascinamento */
		public void mouseReleased(MouseEvent e) {
			dragStart = null;
		}
	};
	
	/** Invocato se il mouse sia premuto in un punto del contenitore valido
	per il ridimensionamento di questo componente */
	private void startResize(Point p) {
		dragStart = p;
	}
	
	/** Ridimensiona questo componente: "quanto" è determinato dallo
	spostamento subito dal mouse */
	private void resize(Point p) {
		int dx = p.x - dragStart.x;
		dragStart = p;
		Dimension size = getSize();
		size.width += dx;
		setPreferredSize(size);
		revalidate();
	}
	
	/** Ferma le operazioni di trascinamento */
	private void stopResize() {
		dragStart = null;
	}
	
	/** Determina se il mouse si trovi più o meno in corrispondenza del bordo 
	[destro] di questo componente */
	private boolean nearBorder(Point p, Rectangle bounds) {
		return 
			p.x >= bounds.x + bounds.width - 2 &&
			p.x <= bounds.x + bounds.width + 2;
	}
	
	/** Applica il cursore di ridimensionamento al contenitore di questo
	componente */
	private void setResizeCursor() {
		Component parent = getParent();
		if(parent != null && parent.getCursor() != RESIZE_CURSOR) {
			plainCursor = parent.getCursor();
			parent.setCursor(RESIZE_CURSOR);
		}
	}
	
	/** Applica il cursore "normale" al contenitore di questo componente */
	private void setPlainCursor() {
		Component parent = getParent();
		if(parent != null) {
			parent.setCursor(plainCursor);
		}
	}
	
	/** Costruttore */
	public ResizableComponent() {
		setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
		setBackground(Color.RED);
		setOpaque(true);
		setPreferredSize(new Dimension(100, 100));
	}
	
	/** Quando questo componente riceve una notifica di inserimento, dopo aver
	condotto le normali operazioni stabilite dal framework, rifila al suo
	contenitore l'adattatore mouseHook */
	public void addNotify() {
		super.addNotify();
		Component parent = getParent();
		if(parent != null) {
			parent.removeMouseListener(mouseHook);
			parent.removeMouseMotionListener(mouseHook);
			parent.addMouseListener(mouseHook);
			parent.addMouseMotionListener(mouseHook);
		}
	}
}
Il resto l'ho messo nel Main ma considera che anche come è fatto questo "resto" è determinante:

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

public class Main {
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new Main().startUI();
			}
		});
	}
	
	private void startUI() {
		JPanel container = new JPanel();
		container.setPreferredSize(new Dimension(400, 400));
		container.setLayout(new FlowLayout(FlowLayout.LEFT));
		container.add(new ResizableComponent());
		JFrame frame = new JFrame("Resiza sample");
		frame.setContentPane(container);
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
	}
}
Nota come l'attribuzione delle dimensioni al componente sia "assoluta": un componente può allargarsi di un milione di pixel. JSplitPane funziona in modo simile solo che assegna ai componenti una nuova dimensione determinata come percentuale dello spazio assegnato al contenitore: questo impedisce ad un componente di assumere larghezze o altezze che fuoriescano dalla regione di spazio assegnata al contenitore.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2006, 12:33   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Il codice riportato è solo un esempio della "meccanica rilevate": ci sono un tot di controlli da eseguire – un componente non accetta dimensioni negative, è presupposto un ridimensionamento orizzontale causato da un trascinamento del lato "destro" – ma quello che manca dovrebbe essere evidente.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2006, 13:12   #6
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
ok, grazie, se ho problemi ti rompo le scatole
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Airbus realizzerà altri 229 satel...
Arianespace lancerà altri satelli...
Eutelsat ha annunciato di aver affidato ...
PLD Space ha annunciato il nuovo razzo s...
CMF Clip Pro, tanta autonomia e design u...
Tre leggende del rally sbarcano in Asset...
iPhone 18 Pro Max, il chip A20 Pro mostr...
Samsung porterà il Privacy Displa...
WINDTRE BUSINESS trasforma la rete mobil...
Anthropic ammette un quarto caso di acce...
Mazda CX-6e, il primo test drive: quando...
La serie HONOR Magic 9 arriva a fine set...
Anker MagGo Power Bank 2 Pro arriva in I...
iRobot rilancia con Roomba Duo, il proto...
#linux su IRC è tornato dopo anni di sil...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:32.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v