如何将已经使用borderlayout布局的面板中的对象居中

时间:2016-07-28 20:51:44

标签: java layout

我搜索了这个网站,其他网站和我的教科书,但无法提出解决方案,所以请点击此处:

我有一个简单的温度。转换程序功能很好但是我想让我的布局更具吸引力,更类似于程序中要求的内容。

现在它看起来像这样:

my program output

我希望它看起来像这样:

Desired Output

输入和输出字段的区别在于所需的输出。

这是我的计划:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Convert extends JFrame{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel convertFrom, convertTo, top, bottom;
    private JLabel label3, label4;
    private JTextField temperature1, temperature2;
    private ButtonGroup radioFrom, radioTo;
    private JRadioButton celsiusBoxTo, fahrenheitBoxTo, kelvinBoxTo, celsiusBoxFrom, fahrenheitBoxFrom, kelvinBoxFrom;


    public Convert(){


        fahrenheitBoxFrom = new JRadioButton( "Fahrenheit", true );
        celsiusBoxFrom = new JRadioButton( "Celsius", false );
        kelvinBoxFrom = new JRadioButton( "Kelvin", false );

        radioFrom = new ButtonGroup();
        radioFrom.add( fahrenheitBoxFrom );
        radioFrom.add( celsiusBoxFrom );
        radioFrom.add( kelvinBoxFrom );

        label3 = new JLabel( "Input" );
        label4 = new JLabel( "Output" );

        fahrenheitBoxTo = new JRadioButton( "Fahrenheit", false );
        celsiusBoxTo = new JRadioButton( "Celsius", true );
        kelvinBoxTo = new JRadioButton( "Kelvin", false );

        radioTo = new ButtonGroup();
        radioTo.add( fahrenheitBoxTo );
        radioTo.add( celsiusBoxTo );
        radioTo.add( kelvinBoxTo );

        convertFrom = new JPanel();
        convertFrom.setLayout( new GridLayout( 4, 1 ) );
        convertFrom.add(new JLabel( "Input Scale" ));
        convertFrom.add( fahrenheitBoxFrom );
        convertFrom.add( celsiusBoxFrom );
        convertFrom.add( kelvinBoxFrom );

        convertTo = new JPanel();
        convertTo.setLayout( new GridLayout( 4, 1 ) );
        convertTo.add(new JLabel( "Output Scale" ));
        convertTo.add( fahrenheitBoxTo );
        convertTo.add( celsiusBoxTo );
        convertTo.add( kelvinBoxTo );

        temperature1 = new JTextField( 10 );
        top = new JPanel();
        top.setLayout(new GridLayout(1, 2));
        top.add(label3);
        top.add(temperature1);
        temperature1.addActionListener( new ActionListener(){

            public void actionPerformed( ActionEvent event ){
                int convertTemp, temp;
                temp = Integer.parseInt( ( ( JTextField ) event.getSource() ).getText() ); 

                if ( fahrenheitBoxFrom.isSelected() && celsiusBoxTo.isSelected() ){
                    convertTemp = ( int ) ( 5.0f / 9.0f * ( temp - 32 ) );
                    temperature2.setText( String.valueOf( convertTemp ) );
                }

                else if ( fahrenheitBoxFrom.isSelected() && kelvinBoxTo.isSelected() ){
                    convertTemp = ( int ) ( 5.0f / 9.0f * ( temp - 32 ) + 273 );
                    temperature2.setText( String.valueOf( convertTemp ) );
                }

                else if ( celsiusBoxFrom.isSelected() && fahrenheitBoxTo.isSelected() ){
                    convertTemp = ( int ) ( 9.0f / 5.0f * temp + 32 );
                    temperature2.setText( String.valueOf( convertTemp ) );
                }

                else if ( celsiusBoxFrom.isSelected() && kelvinBoxTo.isSelected()){
                    convertTemp = temp + 273;
                    temperature2.setText( String.valueOf( convertTemp ) );
                }

                else if ( kelvinBoxFrom.isSelected() && celsiusBoxTo.isSelected()){
                    convertTemp = temp - 273;
                    temperature2.setText( String.valueOf( convertTemp ) );
                }

                else if ( kelvinBoxFrom.isSelected() && fahrenheitBoxTo.isSelected()){
                    convertTemp = ( int ) ( 9.0f / 5.0f * ( temp - 273 ) + 32 );
                    temperature2.setText( String.valueOf( convertTemp ) );
                }
            }
            });

        temperature2 = new JTextField( 10 );
        temperature2.setEditable( false );

        bottom = new JPanel();
        bottom.setLayout(new GridLayout(1, 2));
        bottom.add(label4);
        bottom.add(temperature2);


        Container container = getContentPane();
        container.setLayout(new BorderLayout());
        container.add( top, BorderLayout.NORTH );
        container.add( convertFrom, BorderLayout.WEST );
        container.add( convertTo, BorderLayout.EAST );
        container.add( bottom, BorderLayout.SOUTH );
        setSize( 350,250);
        setVisible( true );

    } 

    public static void main ( String args[] ){
        Convert application = new Convert(); 
        application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }
}

2 个答案:

答案 0 :(得分:1)

BoxLayout可以将组件置于中心位置。 BoxLayout尊重组件的setAlignmentX属性(另请参阅this question的答案)。
但有一点需要注意:如果组件被配置为占用窗口的完整可用宽度(如文本字段那样),则必须管理组件的最大大小。以下是如何为"底部"面板:

javax.swing.Box bottomBox = Box.createHorizontalBox();
bottom = new JPanel();
bottomBox.add(bottom);
bottom.setAlignmentX(java.awt.Component.CENTER_ALIGNMENT);
bottom.add(label4);
temperature2.setMaximumSize(temperature2.getPreferredSize());
bottom.add(temperature2);
...
container.add( bottomBox, BorderLayout.SOUTH );

你可以为" top"做同样的事情。面板。

答案 1 :(得分:0)

您可以使用GridBagLayout执行此任务。它可以轻松地将您的组件放置在4x6网格中,您可以使用GridBagConstraints指定组件之间所需的间距。我会用这个布局。