2017-04-06 2 views
0

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

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

Pensez à utiliser un 'GridBagLayout' au lieu – MadProgrammer

Répondre

3

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

Example

nb: Le rembourrage autour des champs de texte est courtoisie de MacOS, dans ce cas, j'envisager 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); 
+0

Cela semble fonctionner le mieux, merci! – Jerry213

-1

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

result_Label.setPreferredSize(length1.getPreferredSize()); 
+0

Voir [Devrais-je éviter l'utilisation de méthodes de taille définies (Préféré | Maximum | Minimum) dans Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (Oui.) Il vaut mieux laisser ce travail à un gestionnaire de disposition approprié et des contraintes de mise en page. –