2010-10-22 5 views
4

J'ai un canevas AWT que je ne peux pas convertir en composant Swing (il provient de VTK). Je souhaite afficher quelques-unes de ces toiles à l'intérieur d'un JSplitPane. J'ai lu sur le mélange de composants lourds et légers en Java et je sais que c'est une douleur dans la crosse, mais je n'ai pas le choix. Si j'emballe le canevas AWT à l'intérieur d'un JPanel et le place ensuite sur le volet fractionné, le volet fractionné ne fonctionne pas du tout. Toutefois, si je place le canevas AWT à l'intérieur d'un JPanel, puis à l'intérieur d'un JScrollPane, puis les volets de défilement sur le JSplitPane, le volet fractionné fonctionne, mais les canevas AWT ne sont pas redimensionnés correctement. Je suis perdu sur comment obtenir les composants de canevas AWT à redimensionner correctement lorsque le diviseur de JSplitPane est déplacé. Je peux attraper l'opération de déplacement de diviseur et opérer sur les toiles AWT à ce moment-là, mais je ne sais pas quoi faire. J'ai essayé d'appeler invalidate() puis validate() puis repaint(), mais cela n'a pas fonctionné.Utilisation de JSplitPane avec un composant AWT

Des idées?

Voici un exemple du problème

import javax.swing.*; 
import java.awt.*; 

public class SwingAWTError { 
    public static void main(String[] args) { 
     Canvas leftCanvas = new Canvas(); 
     Canvas rightCanvas = new Canvas(); 
     leftCanvas.setBackground(Color.RED); 
     rightCanvas.setBackground(Color.BLUE); 

     JPanel leftPanel = new JPanel(); 
     JPanel rightPanel = new JPanel(); 
     leftPanel.setLayout(new BorderLayout()); 
     rightPanel.setLayout(new BorderLayout()); 
     leftPanel.add(leftCanvas, BorderLayout.CENTER); 
     rightPanel.add(rightCanvas, BorderLayout.CENTER); 

     JScrollPane leftScroll = new JScrollPane(); 
     JScrollPane rightScroll = new JScrollPane(); 
     leftScroll.getViewport().add(leftPanel); 
     rightScroll.getViewport().add(rightPanel); 

     JSplitPane split = new JSplitPane(); 
     split.setLeftComponent(leftScroll); 
     split.setRightComponent(rightScroll); 
     split.setDividerLocation(400); 

     JFrame frame = new JFrame(); 
     frame.getContentPane().setLayout(new BorderLayout()); 
     frame.getContentPane().add(split, BorderLayout.CENTER); 
     frame.setSize(800, 800); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+0

Voulez-vous dire JScrollPane plutôt que JScrollBar? –

+0

Je fais. C'est maintenant réparé. – Jon

+0

Peut-être un SSCCE (http://sscce.org) nous aidera à voir le problème. Vous pouvez créer votre propre Canvas sans utiliser VTK pour démontrer le problème. Vous pouvez également effectuer une mise à niveau vers JDK 1.6.17 (?) Ou JDK 1.7, qui prend désormais en charge le mélange des composants AWT. – camickr

Répondre

4

C'est une façon sale mais cela résoudre:

Lorsque vous appelez pack() sans redimensionner la fenêtre, ne se passe pas grand-chose. Ainsi, lorsque vous redimensionnez d'abord la fenêtre, puis appelez pack(), vos composants sont correctement dessinés. Cela signifie que vous pouvez mettre cette méthode sale dans votre diviseur déplacé méthode d'écouteur:

frame.setPreferredSize(frame.getSize()); // store the current size to restore it after packing. 
frame.setSize(frame.getWidth() + 1, frame.getHeight()); // resize it!! 
frame.pack(); 

Je ne sais pas ce qu'il est exactement, mais il est un behavour étrange en Java ...
Hope this helps jusqu'à ce que vous J'ai trouvé une meilleure solution ...

+0

C'est sale, mais ça marche pour moi. Merci. – Jon

+0

@Jon: De rien. –

2

Vous êtes gentil de pas de chance ici. Il y a un très bon article sur ce sur le site Sun/Oracle: http://java.sun.com/products/jfc/tsc/articles/mixing/

Essentiellement, il se résume à cette directive (prise de ce lien, sous la rubrique z-commande):

Ne pas mélanger légers (Swing) et lourds (AWT) composants dans un conteneur où le composant léger devrait chevaucher le poids lourd .

Edit: je gardais la navigation de ce site et est tombé sur un autre lien, et il semblerait que la situation est légèrement améliorée: http://java.sun.com/developer/technicalArticles/GUI/mixing_components/ Mais je pense que votre cas est l'un de ceux figurant au bas dans la section des limites:

Limites

quelques situations ne sont pas pris en charge:

* Non-opaque lightweight components that have translucent 

pixels (0 < alpha < 255) ne sont pas pris en charge . Si un composant léger partiellement translucide chevauche un composant lourd , le composant lourd ne sera pas visible.

* Embedded heavyweight components must belong to the process that 

a créé le cadre ou l'applet. Le composant lourd doit avoir un pair valide dans le processus principal de l'application (ou applet).

* Advanced Swing key events, such as those events maintained in an 

InputMap, correctement pourrait ne pas fonctionner où sont mélangés légers et poids lourds composants. Il existe aucune solution de contournement connue.

+0

Bien évidemment ce n'est pas ce que je voulais entendre. Laquelle des trois situations que vous avez énumérées est la mienne? Aussi, est-il question de corriger ces problèmes dans les futures versions de Java? – Jon

+0

Désolé, je devinerais seulement. Je n'ai pas eu à utiliser Swing pendant des années, c'est pourquoi je ne savais même pas qu'ils avaient une solution pour certains cas. – Goibniu

Questions connexes