Redimensionner dynamiquement un JScrollPane?
J'Ai deux fichiers. Un extends JFrame, et de l'autre s'Étend Composite.
Chaque fois que je modifie la taille de l'image, que ce soit en maximisant, glisser, que ce soit, je veux le composant ScrollPane pour s'adapter à la taille actuelle de l'image.
Il y a plus, il y a une barre de menus supérieure et une partie inférieure de la barre en tant que bien, mais je laisse à ceux qui pour des raisons de simplicité.
Essentiellement, je veux qu'il fonctionne comme le bloc-notes.
droit maintenant, j'utilise un ComponentListener sur l'image qui appelle une méthode setSize dans l'autre classe.
La méthode setSize est juste:
public void resize(int x, int y)
{
textA.setPreferredSize(new Dimension(x, y-50));
areaScrollPane.setPreferredSize(new Dimension(x,y-50));
}
aussi, pour référence:
public void componentResized(ComponentEvent e)
{
textA.resize(panel.getWidth(),panel.getHeight());
}
Pour info, il s'étend sur un Composite à cause de la façon dont je l'ajouter à l'image:
panel = (JPanel) this.getContentPane();
panel.setLayout(new BorderLayout());
panel.add(textA, BorderLayout.CENTER);
quelle est donc la meilleure façon de le faire?
Merci!
Edit: Voici le scrollpane fichier. Il est appelé textA dans ma main.
public class TextArea extends JPanel
{
JTextArea textA=new JTextArea(500,500);
JScrollPane areaScrollPane = new JScrollPane(textA);
Toolkit toolkit = Toolkit.getDefaultToolkit ();
Dimension dim = toolkit.getScreenSize();
Dimension dim2=(new Dimension((int)(dim.getWidth()),(int)(dim.getHeight()-120)));
public TextArea()
{
//textA.setLineWrap(true);
//textA.setWrapStyleWord(true);
textA.setEditable(true);
textA.setForeground(Color.WHITE);
textA.setBackground(Color.DARK_GRAY);
this.setFont(null);
areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
areaScrollPane.setMinimumSize(new Dimension(300,300));
areaScrollPane.setSize(new Dimension(800,800));
textA.setPreferredSize(dim2);
areaScrollPane.setPreferredSize(dim2);
areaScrollPane.setMaximumSize(dim2);
add(areaScrollPane);
}
@Override
public void resize(int x, int y)
{
textA.setPreferredSize(new Dimension(x, y-50));
areaScrollPane.setPreferredSize(new Dimension(x,y-50));
}
}
et le principal:
public class JEdit extends JFrame implements ComponentListener
{
TextArea textA=new TextArea();
JPanel panel;
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
JEdit run=new JEdit();
}
public JEdit()
{
setTitle("JEdit");
setLayout(new BorderLayout());
setSize(1100, 1000);
this.setMinimumSize(new Dimension(100,100));
//setBackground(Color.BLACK);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
System.out.println("error1");
} catch (InstantiationException ex) {
System.out.println("error2");
} catch (IllegalAccessException ex) {
System.out.println("error3");
} catch (UnsupportedLookAndFeelException ex) {
System.out.println("error4");
}
panel = (JPanel) this.getContentPane();
panel.setLayout(new BorderLayout());
//TopBar top=new TopBar();
//PositionBar posB=new PositionBar();
panel.add(textA, BorderLayout.CENTER);
//add(top,BorderLayout.NORTH);
//add(posB,BorderLayout.SOUTH);
addComponentListener(this);
setVisible(true);
}
public void componentResized(ComponentEvent e)
{
textA.resize(panel.getWidth(),panel.getHeight());
}
public void componentMoved(ComponentEvent e) {
textA.resize(panel.getWidth(),panel.getHeight());
}
public void componentShown(ComponentEvent e) {
textA.resize(panel.getWidth(),panel.getHeight());
}
public void componentHidden(ComponentEvent e) {
textA.resize(panel.getWidth(),panel.getHeight());
}
}
OriginalL'auteur Nyx | 2011-06-05
Vous devez vous connecter pour publier un commentaire.
Concernant le code que vous avez posté, pour les débarrasser de tous les appels à setSize-ces sont généralement pas respectées lors de l'utilisation de gestionnaires de disposition et de se débarrasser de tous vos ComponentListener de choses que c'est superflu puisque vous êtes à l'aide de gestionnaires de disposition pour redimensionner les choses. Le plus gros problème que je vois, c'est que votre permettre à votre TextArea Composite pour l'utilisation de sa mise en page par défaut, qui est FlowLayout, et cela empêchera le JScrollPane qu'il détient de redimensionnement. Donner à cette classe un BorderLayout (ou mieux, il suffit de retourner un JScrollPane de la classe), et vous êtes fixés. par exemple, avec modification rapide et avec le changement de nom des classes pour éviter des affrontements avec la norme des classes Java,
BorderLayout a fait le tour
OriginalL'auteur Hovercraft Full Of Eels
Par défaut une JFrame utilise un BorderLayout (donc il n'est pas nécessaire de le réinitialiser). Tout ce que vous devez faire est d'ajouter le JScrollPane pour le CENTRE de la BorderLayout et il sera redimensionné automatiquement.
Et le code de base serait:
Je ne suis pas sûr de savoir pourquoi vous ajoutez du texte au centre.
Il n'est pas nécessaire d'utiliser setPreferredSize() sur un composant ou d'utiliser un listener sur n'importe quel composant.
Si vous avez besoin de plus d'aide, alors vous devez poster un SSCCE.
textA est mon jscrollpane fichier. Na pas de préciser que.
Publier vos SSCCE!
mise à jour du code, comme votre demande.
Vous avez ajouté le panneau défilant à un panneau, pas le cadre, par conséquent, le groupe est redimensionnée, pas le composant scrollpane.
OriginalL'auteur camickr