1 votes

Problèmes de mise en page de l'interface graphique Java

Je suis en train d'écrire un petit programme Java GUI, et j'ai quelques problèmes avec Java qui ne présente pas les choses correctement. Je n'ai pas fait beaucoup de code Java GUI dernièrement, donc j'ai du mal à voir où se situe le problème.

    final JFreeChart chart = createChart(dataset);
    final ChartPanel chartPanel = new ChartPanel(chart, false);
    chartPanel.setPreferredSize(new Dimension(500, 270));
    JPanel buttonPanel = new JPanel();
    buttonPanel.setPreferredSize(new Dimension(500,50));

    JButton toggleButton = new JButton("Toggle");
    final JTextField minRange = new JTextField("10");
    final JTextField maxRange = new JTextField("1000");
    JButton setLimits = new JButton("Set Limits");

    buttonPanel.add(toggleButton, BorderLayout.NORTH);
    buttonPanel.add(minRange, BorderLayout.SOUTH);
    buttonPanel.add(maxRange, BorderLayout.SOUTH);
    buttonPanel.add(setLimits);

JSplitPane jsp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, chartPanel, buttonPanel);
jsp.setDividerLocation(0.8);
setContentPane(jsp);

Ce qui se passe ici, c'est que toutes les options de mise en page sont complètement ignorées. Les composants de l'interface graphique s'affichent correctement, et le diviseur ignore la taille préférée de JFreeChart, et le comprime à environ 5 % de l'espace en haut du cadre.

4voto

Dan Dyer Points 30082

Outre les problèmes liés au fait que le splitpane ne respecte pas les tailles souhaitées, vous utilisez les constantes BorderLayout mais vous n'avez pas spécifié la disposition du panneau (la disposition par défaut est FlowLayout).

Ceci :

JPanel buttonPanel = new JPanel();

Ça devrait l'être :

JPanel buttonPanel = new JPanel(new BorderLayout());

1voto

John Gardner Points 10882

Je crois que l'utilisation d'une proportion flottante sur JSplitPane ne fonctionne qu'une fois que le volet divisé est "réalisé", sinon vous obtenez une proportion de zéro parce qu'il ne sait pas quelle taille il va avoir.

également :

buttonPanel.add(minRange, BorderLayout.SOUTH);
buttonPanel.add(maxRange, BorderLayout.SOUTH);

BorderLayout ne permet qu'à un seul composant de se trouver dans chaque zone, donc min range n'apparaîtra jamais, car maxRange est maintenant "le" composant sud. Si vous voulez les deux, vous devrez mettre ces 2 composants dans un autre panneau, puis ajouter ce panneau au sud.

0voto

OscarRyz Points 82553

Essayez également de définir la taille minimale.

Voir : http://stackoverflow.com/questions/538240/java-gui-problems

0voto

Michael Myers Points 82361

JSplitPane fait attention à la taille minimale, et non à la taille préférée. Essayez simplement de changer setPreferredSize à setMinumumSize .

0voto

Pyrolistical Points 12457

Dan Dyer a raison, tu n'as pas mis en place la mise en page.

Vous pouvez également le définir par buttonPanel.setLayout(new BorderLayout())

Et John Gardner a raison de dire que vous définissez un composant pour BorderLayout.SOUTH deux fois.

Consultez également MigLayout si vous ne le savez pas déjà. C'est le gestionnaire de mise en page le moins "surprenant" que j'aie jamais utilisé. Il fonctionne tout simplement. Il faut un peu d'apprentissage, mais c'est très simple une fois que vous avez maîtrisé la syntaxe.

Et j'éviterais SplitPane si vous le pouvez... il est très délicat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X