2017-04-06 62 views
0

我想制作一个GUI,其中包含三个文本框和一个使用Jlabel显示的垂直与文本框对齐的结果。不过,我也想为此标签添加边框,以便边框的大小和文本字段的大小相同。没关系,如果标签溢出边框。它现在看起来像这样:GUI 我手动添加空格为了容纳空间,但我仍然无法使标签对齐与textfields相同的宽度,任何人都知道请帮助解决问题。带固定边框的Java GUI Jlabel

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

考虑使用'GridBagLayout'代替 – MadProgrammer

回答

3

考虑使用它为您提供了部件的布局方式,例如更多的控制不同的布局管理器,一个GridBagLayout

Example

注:周围的文本字段的填充是礼貌的MacOS,在这种情况下,我会考虑使用不可编辑的文本字段

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

这似乎是最好的工作,谢谢! – Jerry213

-1

设置结果字段的首选大小如下

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

请参阅[我是否应避免使用Java Swing中的set(Preferred | Maximum | Minimum)Size方法?](http://stackoverflow.com/q/7229226/418556)(是)。一个合适的布局管理器和布局约束。 –