J'ai un Lorsque je saisi du texte dans alors comment puis-je rafraîchir fonctionne uniquement Il y a un petit exemple: p> jPanel code> (jaune) placé dans
jscrollpane code>.
p>
jtextpane code>, il redimensionne, mais la barre de défilement verticale n'est toujours pas active.
YelowPanel.Getsize () Code> renvoie la même valeur que c'était avant. (Vous pouvez le voir sur RedPanel). P>
p>
jaune code>? Je veux faire défiler la panneau verticalement.
J'ai essayé de: p>
panneauCreating.setpreferredsize (nouvelle dimension (333, 777)); code> mais je ne sais pas quelle taille ensemble. Cela dépend du contenu. P>
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);
}
}
3 Réponses :
La disposition par défaut de addendum: considérez également des aménagements imbriqués. L'exemple ci-dessous utilise jPanel code> est
flowlayout code>. Essayez
gridlayout code> à la place. Il y a un exemple associé ici . Par exemple,
boxlayout code> pour le panneau de gauche. P>
P>
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
/** @see https://stackoverflow.com/questions/9184476 */
public class SwingTest extends JFrame {
private static final int N = 8;
public SwingTest() {
initComponents();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new SwingTest().setVisible(true);
}
});
}
private JPanel panelCenter, panelCreating;
private JScrollPane scrollPaneCreating, scrollPaneCenter;
private void initComponents() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panelCreating = new JPanel();
scrollPaneCreating = new JScrollPane(panelCreating,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
panelCenter = new JPanel();
panelCenter.setBackground(Color.blue);
scrollPaneCenter = new JScrollPane(panelCenter);
// ----------------- Left Panel Init -----------------------
panelCreating.setLayout(new BoxLayout(panelCreating, BoxLayout.Y_AXIS));
panelCreating.setBackground(Color.orange);
panelCreating.setBorder(BorderFactory.createEmptyBorder(N, N, N, N));
panelCreating.add(createTextPane());
panelCreating.add(Box.createVerticalStrut(N));
panelCreating.add(createTextPane());
panelCreating.add(Box.createVerticalStrut(N));
panelCreating.add(createTextPane());
// -------------------------------------------------------
setLayout(new GridLayout(1, 0));
add(scrollPaneCreating);
add(scrollPaneCenter);
pack();
}
private JTextPane createTextPane() {
JTextPane pane = new JTextPane();
pane.setText(""
+ "Twas brillig and the slithy toves\n"
+ "Did gyre and gimble in the wabe;\n"
+ "All mimsy were the borogoves,\n"
+ "And the mome raths outgrabe.");
pane.setBorder(BorderFactory.createEmptyBorder(N, N, N, N));
return pane;
}
}
J'utilise uniquement la grillebaglayout. Panneau intérieur et extérieur. Mais quand j'utilise gridlayout code> dans le SSCCE ci-joint, j'ai le même problème ..
au lieu de définir une taille préférée sur Edité pour ajouter: une autre alternative est de définir des tailles sur le code> jvieport code> qui est connecté au volet de défilement. La fenêtre est l'endroit où le contenu est affiché. Vous pouvez choisir le volet de défilement comme étant composé de la fenêtre Viewport Plus ScrollBars. Si le volet de défilement est réglé sur une taille fixe, la taille de la fenêtre est déterminée en soustrayant la taille de la barre de défilement. Mais si la fenêtre de la fenêtre est définie sur une taille fixe, la taille du volet de défilement est déterminée en ajoutant la taille de la barre de défilement à la taille de la fenêtre. La définition d'une taille fixe sur la fenêtre est préférable si vous souhaitez contrôler avec précision la quantité de contenu à afficher à l'écran, car les tailles de barres de défilement peuvent varier selon le système d'exploitation. P> panneauCréation code>, définissez-le sur
Scrollpanereatining code>. Et ne définissez pas de taille préférée sur les composants de texte, ils augmenteront lorsque vous y ajoutez de nouvelles lignes de texte. L'idée est d'avoir le panneau à l'intérieur du volet de défilement grandir aussi grand qu'elle doit, et il suffit de restreindre la taille de la vitre de défilement elle-même.
scrollPaneCreating.getViewport().setMinimumSize(new Dimension(160, 200));
scrollPaneCreating.getViewport().setPreferredSize(new Dimension(160, 200));
C'était mon erreur. Et je n'ai même pas besoin de changer la mise en page. Merci
J'ai corrigé votre problème en ajoutant 1 ligne.
@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;
Pourquoi la barre de défilement horizontale serait-elle lui-même l'activer lorsque les composants à l'intérieur ne se développent jamais verticalement? Veuillez inclure un SSCCE car ce n'est pas clair ce que vous demandez (au moins pour moi).
Désolé, je veux dire la barre de défilement verticale ..
@alaster s'il vous plaît pouvez-vous modifier votre message avec le code dans formulaire SSCCE.org , car celui-ci pourrait être leçon pourquoi jscrollpane ne veut pas 'T travaille en utilisant Absolutelayout, +1 pour documenter ce problème étrange
Terminé. J'ai utilisé seulement la grillebaglayout
"DONE
Désolé, le SSCCE Publié maintenant.
Vous devez remplacer
jComponent.LakeOrthindOution () code> pour empêcher la balançoire de vous mentir.