PDA

View Full Version : [java] dimensione minima JFrame non rispettata


afsdfdlecosdfsfdcco
17-12-2007, 15:37
Allora, ho questo costruttore (la classe estende JFrame):

public DownloadManager()
{
setTitle("Download Manager");
setResizable(true);

frame = this;

final JDialog aboutDialog = createAboutDialog();

myApplication = Application.getApplication();
myApplication.addPreferencesMenuItem();
myApplication.addAboutMenuItem();

myApplication.addApplicationListener(new ApplicationAdapter()
{
public void handleAbout(ApplicationEvent e)
{
aboutDialog.setVisible(true);
e.setHandled(true);
}

public void handleOpenApplication(ApplicationEvent arg0)
{
System.out.println("handleOpenApplication - da fare");
}

public void handlePreferences(ApplicationEvent arg0)
{
System.out.println("handlePreferences - da fare");
}

public void handleQuit(ApplicationEvent arg0)
{
System.out.println("handleQuit - da fare");

try
{
saveAll();
}
catch (Exception ex)
{
}

actionExit();
}

public void handleReOpenApplication(ApplicationEvent arg0)
{
System.out.println("handleReOpenApplications - da fare");
frame.setVisible(true);
}
});

setDefaultCloseOperation(HIDE_ON_CLOSE);
setMinimumSize(new Dimension(200, 200));

Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(createAddPanel(), BorderLayout.NORTH);
c.add(createDownloadsPanel(), BorderLayout.CENTER);
c.add(createButtonsPanel(), BorderLayout.SOUTH);

try
{
readAll();
}
catch (Exception ex)
{
System.out.println(ex); // gestire
}

pack();
setLocationRelativeTo(null);
setVisible(true);
}

Il problema e' che la dimensione minime settata al jframe non viene rispettata! Infatti se provo a ridimensionare riesco a ridure il JFrame ad una strisciolina microscopia ed invece dovrebbe fermarsi a 200*200.

Perche' succede?

Ah, uso java 1.5 su OS X (il problema c'e' anche su linux ed xp)

Grazie ^^

VICIUS
17-12-2007, 17:07
Da quello che so è un bug conosciuto di java. Non ha mai funzionato molto bene. Quello che puoi fare è intercettare il ridimensionamento della finestra e settare i vecchi valori se scendono sotto i valori minimi.

ciao ;)

afsdfdlecosdfsfdcco
17-12-2007, 19:22
Da quello che so è un bug conosciuto di java. Non ha mai funzionato molto bene. Quello che puoi fare è intercettare il ridimensionamento della finestra e settare i vecchi valori se scendono sotto i valori minimi.

ciao ;)

Ah ok, grazie, provero' a intercettare il ridimensionamento ^^

Grazie :)

afsdfdlecosdfsfdcco
17-12-2007, 19:35
Ho fatto cosi':


addComponentListener(new ComponentAdapter()
{
public void componentResized(final ComponentEvent e)
{
JFrame f = (JFrame) e.getComponent();

Dimension d = f.getSize();

int width = d.width < 500 ? 500 : d.width;
int height = d.height < 250 ? 250 : d.height;

System.out.println("(" + width + ", " + height + ")");

f.setSize(width, height);
}
});




Funziona ma il ridimensionamento non si blocca "strada facendo" :(
Praticamente posso ridurre quanto voglio il jframe e solo quando mollo si ridimensiona :(

Si puo' rimediare?

Mixmar
17-12-2007, 20:53
Ho fatto cosi':

[CUT]

Funziona ma il ridimensionamento non si blocca "strada facendo" :(
Praticamente posso ridurre quanto voglio il jframe e solo quando mollo si ridimensiona :(

Si puo' rimediare?

Leggendo la documentazione dell'interfaccia ComponentListener si trova:

Component events are provided for notification purposes ONLY; The AWT will automatically handle component moves and resizes internally so that GUI layout works properly regardless of whether a program registers a ComponentListener or not. (link (http://java.sun.com/j2se/1.5.0/docs/api/java/awt/event/ComponentListener.html))

Che mi fa pensare che purtroppo non faccia quello che vuoi tu, in quanto appunto viene notificato DOPO la fine del ridimensionamento. L'unica idea che mi viene in mente è quella di modificare l'implementazione del ridimensionamento in AWT o Swing: prova a guardare il codice di "setSize" di JFrame, poi dovrai fare l'override di qualcosa... mi spiace, ma non ho un'idea precisa... :boh:

Altrimenti puoi provare ad usare ChangeListener (http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/event/ChangeListener.html) (ma credo che presenti lo stesso problema) oppure puoi provare a intercettare gli eventi del mouse che possono provocare il ridimensionamento (click sul bordo della finestra) e fermarli "in tempo". A fare bene, dovresti intercettare anche i tasti di ridimensionamento, ma magari quelli potresti disabiltarli del tutto, per semplificarti un po' il problema.

afsdfdlecosdfsfdcco
17-12-2007, 21:22
Leggendo la documentazione dell'interfaccia ComponentListener si trova:



Che mi fa pensare che purtroppo non faccia quello che vuoi tu, in quanto appunto viene notificato DOPO la fine del ridimensionamento. L'unica idea che mi viene in mente è quella di modificare l'implementazione del ridimensionamento in AWT o Swing: prova a guardare il codice di "setSize" di JFrame, poi dovrai fare l'override di qualcosa... mi spiace, ma non ho un'idea precisa... :boh:

Altrimenti puoi provare ad usare ChangeListener (http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/event/ChangeListener.html) (ma credo che presenti lo stesso problema) oppure puoi provare a intercettare gli eventi del mouse che possono provocare il ridimensionamento (click sul bordo della finestra) e fermarli "in tempo". A fare bene, dovresti intercettare anche i tasti di ridimensionamento, ma magari quelli potresti disabiltarli del tutto, per semplificarti un po' il problema.


mmm, troppo incasinato per il programmino che sto facendo ^^
Se ho tempo provo ad implementare qualcosa.

Grazie a tutti ;)