0

I want to make a GUI that contains three textfields and one result displayed using Jlabel which align with the textfields vertically. However, I also wanted to add a border to this label so that the border is fixed size and have same size as textfields. It's ok if the label overflow the border. It now looks like this : GUI I manually add spaces in order to hold the space, however I still couldn't make the label align same width as textfields, anyone knows please help fix the problem.

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));
    }
  }

}
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
Jerry213
  • 81
  • 1
  • 10

2 Answers2

3

Consider using a different layout manager which gives you more control over how components are laid out, for example, a GridBagLayout

Example

nb: The padding around the text fields is courtesy of MacOS, in this case, I'd consider using a non-editable text field instead

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);
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
-1

Set the preferred size of the result field as below

result_Label.setPreferredSize(length1.getPreferredSize());
Zak
  • 114
  • 3
  • See [Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?](http://stackoverflow.com/q/7229226/418556) (Yes.) This is a job better left to an appropriate layout manager and layout constraints. – Andrew Thompson Apr 07 '17 at 00:35