Je veux créer une interface graphique contenant trois champs de texte et un résultat affiché à l'aide de Jlabel qui s'alignent verticalement avec les champs de texte. Cependant, je voulais également ajouter une bordure à cette étiquette afin que la bordure soit de taille fixe et ait la même taille que les champs de texte. Ce n'est pas grave si l'étiquette déborde de la bordure. Il ressemble maintenant à ceci: GUI J'ajoute manuellement des espaces afin de contenir l'espace, mais je ne pouvais toujours pas aligner l'étiquette sur la même largeur que les champs de texte, tout le monde sait s'il vous plaît aider à résoudre le problème.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestScorePanel extends JPanel{
  private JPanel p5, label_panel,text_panel;
  private JButton calculate_average;
  private JLabel length1_label, length2_label, length3_label,output_Label,result_Label;
  private JTextField length1, length2, length3; 

  public TestScorePanel(){
     length1_label = new JLabel("Enter length #1");
     length2_label = new JLabel("Enter length #2");
     length3_label = new JLabel("Enter length #3");
     output_Label = new JLabel("Average");
     result_Label = new JLabel("                      ");//spaces used to hold the space
     length1 = new JTextField(5);
     length2 = new JTextField(5);
     length3 = new JTextField(5);
     calculate_average = new JButton("Calculate Average");
     calculate_average.addActionListener(new ScoreListener());
     p5 = new JPanel();
     label_panel = new JPanel(); // left side labels 
     text_panel = new JPanel(); // right side labels
     label_panel.setLayout(new BoxLayout(label_panel, BoxLayout.Y_AXIS));//set vertical layout for panel
     text_panel.setLayout(new BoxLayout(text_panel, BoxLayout.Y_AXIS));
     setBorder(BorderFactory.createEmptyBorder(10,10,10,10));//set 

     result_Label.setBorder(BorderFactory.createLineBorder(Color.black));
     //setMinimumSize donesn's seem to work the way I wanted.
     result_Label.setMinimumSize(new Dimension(400,20));

     p5.setBorder(BorderFactory.createTitledBorder("Enter Three lengths"));
     p5.add(label_panel);
     p5.add(Box.createRigidArea(new Dimension (50,0)));
     p5.add(text_panel);
     add(p5);

     label_panel.add(length1_label);
     text_panel.add(length1);
     label_panel.add(Box.createRigidArea(new Dimension (0, 10)));
     text_panel.add(Box.createRigidArea(new Dimension (0, 10)));

     label_panel.add(length2_label);
     text_panel.add(length2);
     label_panel.add(Box.createRigidArea(new Dimension (0, 10)));
     text_panel.add(Box.createRigidArea(new Dimension (0, 10)));

     label_panel.add(length3_label);
     text_panel.add(length3);
     label_panel.add(Box.createRigidArea(new Dimension (0, 10)));
     text_panel.add(Box.createRigidArea(new Dimension (0, 10)));

     label_panel.add(output_Label);
     text_panel.add(result_Label);

     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
     add(Box.createRigidArea(new Dimension (0, 10)));
     add(calculate_average);
     setPreferredSize(new Dimension(320,220));

  }


  private class ScoreListener implements ActionListener{
    public void actionPerformed(ActionEvent event){
      int len1, len2, len3, average;
      len1 = Integer.parseInt(length1.getText());
      len2 = Integer.parseInt(length2.getText());
      len3 = Integer.parseInt(length3.getText());
      average= (len1+ len2+ len3)/3;
      if (event.getSource() == calculate_average)
        result_Label.setText(Integer.toString(average));
    }
  }

}
0
Jerry213 6 avril 2017 à 04:16

2 réponses

Meilleure réponse

Pensez à utiliser un gestionnaire de disposition différent qui vous donne plus de contrôle sur la façon dont les composants sont disposés, par exemple, un GridBagLayout

Example

nb: Le remplissage autour des champs de texte est une gracieuseté de MacOS, dans ce cas, j'envisagerais d'utiliser un champ de texte non modifiable à la place

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("Enter Length #1"), gbc);
gbc.gridy++;
add(new JLabel("Enter Length #2"), gbc);
gbc.gridy++;
add(new JLabel("Enter Length #3"), gbc);
gbc.gridy++;
add(new JLabel("Enter Length #4"), gbc);
gbc.gridy++;
add(new JLabel("Average"), gbc);

gbc.gridx++;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(new JTextField(10), gbc);
gbc.gridy++;
add(new JTextField(10), gbc);
gbc.gridy++;
add(new JTextField(10), gbc);
gbc.gridy++;
add(new JTextField(10), gbc);
gbc.gridy++;
JLabel average = new JLabel(" ");
average.setBorder(BorderFactory.createLineBorder(Color.BLACK));
add(average, gbc);
3
MadProgrammer 6 avril 2017 à 01:35

Définissez la taille préférée du champ de résultat comme ci-dessous

result_Label.setPreferredSize(length1.getPreferredSize());
-1
Zak 6 avril 2017 à 12:58