Как мне уменьшить текстовое поле и метки положения в правом нижнем углу, используя BorderLayout? - PullRequest
0 голосов
/ 19 сентября 2018

Мне сказали использовать BorderLayout для этого проекта.Я не уверен, как правильно определить размер моего текстового поля, и я не уверен, как поместить JLabel answerCelsius в нижний правый угол.

Я попытался изменить текстовое поле с помощью кода - farenheit.setPreferredSize((new Dimension(80,20))); Это, похоже, ничего не делает.

Позволяет ли использование BorderLayout выравнивать по сетке SouthEast?Или есть только 5 отдельных сеток?

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class JTemperature implements ActionListener {

    /** initialize the frame, labels, and textfield so I can use them in 
later methods
 */
private JTextField farenheit;
private JLabel name, enter, degreesFarenheit, answer, answerCelsius;
private JFrame jfrm;

JTemperature() {

    /** Makes a Jframe and titles it Temperature Converter
     */
    jfrm = new JFrame("Temperature Converter");

    /**
      set my borders and layout
     */
    jfrm.getContentPane().setLayout(new BorderLayout());

    /** sets size of Jframe
     */
    jfrm.setSize(240, 120);

    /** when the jframe closes it exits by default
     */
    jfrm.setDefaultCloseOperation(jfrm.EXIT_ON_CLOSE);

    /** initialize the label name
     */
    name = new JLabel("(c) First name, Last", JLabel.CENTER);


    /** initialize the label enter
     */
    enter = new JLabel("Enter: ", JLabel.CENTER);

    /** initialize the label answerCelsius
     */
    answerCelsius = new JLabel("degrees C", JLabel.CENTER);

    /** initialize the label degreesFarenheit
     */
    degreesFarenheit = new JLabel("degrees F", JLabel.CENTER);


    /** initialize farenheit jtextfield for user input
     * and align it center
     */
    farenheit = new JTextField("Input");


    /** add my labels to my grid
     */

    jfrm.add(name, BorderLayout.NORTH);
    jfrm.add(enter, BorderLayout.WEST);
    jfrm.add(farenheit, BorderLayout.CENTER);
    jfrm.add(degreesFarenheit, BorderLayout.EAST);
    jfrm.add(answerCelsius, BorderLayout.SOUTH);

    /** attach the action listener to farenheit
     */
    farenheit.addActionListener(this);

    /** makes the frame visible
     */
    jfrm.setVisible(true);

}

public void actionPerformed(ActionEvent ae) {

    /**
     * try and catch statement error on improper input
     * math for farenheit to celsius conversion
     * formatted string to round to hundreth place
     */
    try {

        double userInput = Double.parseDouble(farenheit.getText());
        double celsius = (userInput - 32) * 5 / 9;
        String roundedCelsius = String.format("%,.2f ", celsius);
        answerCelsius.setText("= "+roundedCelsius+" degrees C");



    } catch (NumberFormatException e) {
        answerCelsius.setText("Invalid Input");


    }
}


public static void main (String [] args){

    /**
     * run program
     */
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new JTemperature();

        }
    });
}
}

1 Ответ

0 голосов
/ 19 сентября 2018

Мне сказали использовать BorderLayout для этого проекта.Я не уверен, как правильно выбрать размер моего текстового поля, и я не уверен, как поместить JCabel answerCelsius в нижний правый угол.

Вот подход к расположению answerCelsius JLabel длянижний правый (юго-восток) окна.Это делается с помощью javax.swing.Box в пределах BorderLayout.Вот код, который я использовал для этого:

Вариант 1 :

Я заменил эту строку:

jfrm.add(answerCelsius, BorderLayout.SOUTH);

с этим кодом:

Box hbox = Box.createHorizontalBox();
Component padding = Box.createHorizontalStrut(160);
hbox.add(padding);
hbox.add(answerCelsius);
jfrm.add(hbox, BorderLayout.SOUTH);

На следующих снимках экрана показаны до и после изменения кода:

enter image description here

enter image description here


ПРИМЕЧАНИЕ : в приложении необходимо настроить отступВыполните это в соответствии с требованием.


Опция 2 :

Замените этот код:

jfrm.add(degreesFarenheit, BorderLayout.EAST);
jfrm.add(answerCelsius, BorderLayout.SOUTH);

с этим кодом:

Box vbox = Box.createVerticalBox();
Component padding = Box.createVerticalStrut(20);
vbox.add(padding);
vbox.add(degreesFarenheit);
vbox.add(padding);
vbox.add(answerCelsius);
jfrm.add(vbox, BorderLayout.EAST);

Результат:

enter image description here

...