Pourquoi mon Composite à l'intérieur d'un JScrollPane pas de défilement?
J'ai un JPanel
(jaune) placé dans JScrollPane
.
Quand je tape du texte dans JTextPane
, il redimensionne, mais la barre de défilement verticale est toujours pas active. yelowPanel.getSize()
renvoie la même valeur qu'avant.`(Vous pouvez le voir sur redPanel).
Alors, comment puis-je actualiser yellowPanel
? Je veux panneau de défilement verticale.
J'ai essayé de:
panelCreating.revalidate();
panelCreating.invalidate();
panelCreating.repaint();
Fonctionne uniquement panelCreating.setPreferredSize(new Dimension(333, 777));
mais je ne sais pas quelle taille à définir. Cela dépend du contenu.
Il y a un petit exemple:
package swingtest;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
public class SwingTest extends JFrame {
public SwingTest() {
initComponents();
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new SwingTest().setVisible(true);
}
});
}
private JPanel panelCenter, panelCreating;
private JScrollPane scrollPaneCreating, scrollPaneCenter;
private JTextPane textPane1, textPane2;
private JButton button1;
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new Dimension(300, 300));
panelCreating = new JPanel();
panelCreating.setMinimumSize(new Dimension(160, 200));
panelCreating.setPreferredSize(new Dimension(160, 200));
scrollPaneCreating = new JScrollPane(panelCreating,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
textPane1 = new JTextPane();
textPane1.setText("a\na");
textPane2 = new JTextPane();
textPane2.setText("b\nb");
button1 = new JButton("+++");
panelCenter = new JPanel();
panelCenter.setBackground(Color.blue);
scrollPaneCenter = new JScrollPane(panelCenter);
//----------------- Left Panel Init -----------------------
panelCreating.setLayout(new GridBagLayout());
panelCreating.setBackground(Color.ORANGE);
panelCreating.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(0, 0, 4, 4);
c.anchor = GridBagConstraints.FIRST_LINE_START;
c.weightx = c.weighty = 0;
c.gridx = 0;
c.gridy = GridBagConstraints.RELATIVE;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridheight = 1;
c.fill = GridBagConstraints.BOTH;
panelCreating.add(textPane1, c);
button1.addActionListener(new ActionListener() {
int height = 50;
@Override
public void actionPerformed(ActionEvent e) {
textPane1.setText(textPane1.getText() + "\na");
textPane1.setPreferredSize(new Dimension(150, height));
textPane2.setText(textPane2.getText() + "\nb");
textPane2.setPreferredSize(new Dimension(150, height));
height += 30;
panelCreating.revalidate();
panelCreating.repaint();
scrollPaneCreating.revalidate();
}
});
panelCreating.add(button1, c);
panelCreating.add(textPane2, c);
//-------------------------------------------------------
getContentPane().setLayout(new GridBagLayout());
c = new GridBagConstraints();
c.ipadx = c.ipady = 0;
c.insets = new Insets(0, 0, 0, 0);
c.weighty = 0;
c.gridheight = 1;
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
c.weightx = 0;
c.fill = GridBagConstraints.BOTH;
getContentPane().add(scrollPaneCreating, c);
c.gridx = 1;
c.gridy = 1;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
getContentPane().add(scrollPaneCenter, c);
}
}
Panneau jaune utilise également le GridBagLayout.
Désolé pour mon anglais
Pourquoi la barre de défilement horizontale activer lui-même lorsque les composants à l'intérieur seulement jamais pousser à la verticale? Veuillez inclure une sscce car il n'est pas clair ce que vous demandez (au moins pour moi).
désolé, je veux dire de barre de défilement verticale..
s'il vous plaît pouvez-vous modifier votre message avec le code de sscce.org la forme, car cela pourrait être la leçon pourquoi JScrollPane ne fonctionne pas en utilisant AbsoluteLayout, +1 pour documenter cette étrange question
Fait. J'ai utilisé uniquement le GridBagLayout
"en Fait.: Désolé, ce qui est fait? Je vois 2 demandes pour un SSCCE mais pas SSCCE.
désolé, je veux dire de barre de défilement verticale..
s'il vous plaît pouvez-vous modifier votre message avec le code de sscce.org la forme, car cela pourrait être la leçon pourquoi JScrollPane ne fonctionne pas en utilisant AbsoluteLayout, +1 pour documenter cette étrange question
Fait. J'ai utilisé uniquement le GridBagLayout
"en Fait.: Désolé, ce qui est fait? Je vois 2 demandes pour un SSCCE mais pas SSCCE.
OriginalL'auteur alaster | 2012-02-07
Vous devez vous connecter pour publier un commentaire.
Au lieu de définir une taille préférée sur
panelCreating
,scrollPaneCreating
. Et de ne pas définir une taille préférée sur les composantes d'un texte, ils augmenteront à mesure que vous ajoutez de nouvelles lignes de texte. L'idée est d'avoir le panneau à l'intérieur du panneau défilant atteindre la taille qu'il doit, et juste réduire la taille de la faire défiler le volet lui-même.Édité pour ajouter: une autre solution consiste à définir les tailles sur le
JViewport
qui est attaché au panneau défilant. La fenêtre est où le contenu est affiché. Vous pouvez sorte de penser le panneau défilant comme étant composé de la fenêtre d'affichage, plus de barres de défilement. Si le volet de défilement est réglé à une taille fixe, puis la taille de la fenêtre est obtenue par la soustraction de la barre de défilement de la taille. Mais si la fenêtre d'affichage est réglé à une taille fixe, puis le panneau défilant taille est déterminée par l'ajout de la barre de défilement de la taille pour la taille de la fenêtre. Fixe la taille de la fenêtre d'affichage est préférable si vous souhaitez contrôler avec précision la quantité de contenu doit être affiché sur l'écran, car la barre de défilement tailles peuvent varier selon le système d'exploitation.OriginalL'auteur Kevin K
La disposition par défaut de
JPanel
estFlowLayout
. EssayezGridLayout
à la place. Il y a un exemple associé ici. Par exemple,Addendum: Aussi envisager de imbriqués les mises en page. L'exemple ci-dessous utilise
BoxLayout
pour le panneau de gauche.GridLayout
en attaché SSCCE, j'ai le même problème..J'ai montré une autre approche ci-dessus.
belle alternative +1
cela fonctionne, merci
OriginalL'auteur trashgod
J'ai résolu votre problème en ajoutant 1 ligne.
La ligne doit être insérée après les lignes suivantes;
Explication:
La grille de mise en page sac ne la définissez pas de volet préféré de la taille lorsque vous définissez la taille par défaut de la textPanes à l'intérieur, mais le composant scrollPane seulement parchemins basé sur la taille de la fenêtre. Donc, vous devez définir la nouvelle taille de la fenêtre à chaque fois que vous modifiez la taille des composants, le composant scrollPane saura exactement ce qu'il doit faire. C'est ce que j'ai fait, ajouter une ligne que l'augmentation de la taille préférée de creatingPanel, qui est le seul à l'intérieur de la scrollPanel
OriginalL'auteur Nievinski