Нужна помощь Java с объединением нескольких классов в графическом интерфейсе - PullRequest
0 голосов
/ 22 февраля 2011

Я подготовил 2 класса, которые выполняют функцию, которую я хотел бы заключить в один удобный и удобный графический интерфейс.

Вот первый класс:

import java.util.Scanner;
import java.text.*;

public class inputDecimal {

    Scanner input = new Scanner( System.in );    
DecimalFormat  decConv =  new DecimalFormat("00.00");

double dec;
double remain;
double remaindb;
double mindb;
int deg;
int min;
double sec;

System.out.print("Enter the Decimal Coordinate: ");
dec = input.nextDouble();

deg = (int)dec;
remain = dec - deg;
remaindb = remain * 60;
min = (int)remaindb;
mindb = remaindb - min;
sec = mindb * 60;

System.out.printf("Your Coordinate Equals "+deg+"\u00b0"+min+"'"+decConv.format(sec)+"\"\n");

}

Вот второй класс:

import java.util.Scanner;
import java.text.*;

class inputDegree {

   Scanner input = new Scanner( System.in );            
   DecimalFormat  decConv =  new DecimalFormat("000.000");

double deg;
double min;
double sec;
double degadd;
double minup;
double minadd;
double dec;

System.out.print("Enter the Degrees: ");
deg = input.nextDouble();

System.out.print("Enter the Minutes: ");
min = input.nextDouble();

System.out.print("Enter the Seconds: ");
sec = input.nextDouble();   

degadd = sec / 60;
minup = degadd + min;
minadd = minup / 60;
dec = deg + minadd;

System.out.printf("Your Converted Coordinate Equals "+ decConv.format(dec) +"\n");



 }

Хорошо, так что изложены две основные функции, которые мне нужно выполнить. Теперь, часть, с которой я хочу помочь, - это создание основного класса, который будет вызывать эти два класса по мере необходимости. Я просто хочу, чтобы графический интерфейс отображал 2 кнопки. Одна кнопка говорит «Градус ввода», а другая - «Десятичный ввод». Затем, когда пользователь нажимает на одну из кнопок, он вызывает соответствующий класс и запрашивает ввод.

Спасибо за помощь в решении этой проблемы. Я новичок в Java и программировании в этом отношении, так что это действительно поможет соединить некоторые части этого процесса, с которыми я недавно боролся.

================================

Остальные комментарии являются последующими, поскольку этот вопрос развился:

Я проследил за вашим ответом (Алекси), и есть несколько быстрых последующих вопросов:

(1) В ответ на вопрос "вы уверены, что хотите графический интерфейс, а не просто текстовый интерфейс?" Мой ответ - нет, я не уверен. Я хотел бы в конечном итоге создать GPS-конвертер, который я смогу встроить на веб-сайт. Итак, какой бы формат я ни делал с лучшим, это то, что мне нужно.

(2) Когда я пытаюсь скомпилировать окончательный код, который вы предоставили под названием «AwesomeGUI.java», я получаю следующие ошибки:

AwesomeGUI.java:137: cannot find symbol
symbol  : method isEmpty()
location: class java.lang.String
  if (textField.getText().isEmpty()) {
                       ^
AwesomeGUI.java:146: method does not override a method from its superclass
@Override
 ^
AwesomeGUI.java:161: method does not override a method from its superclass
@Override
 ^
3 errors

(3) В противном случае я смог скомпилировать программу с помощью пошагового процесса, который вы предоставили. На самом деле я просто хочу создать программу, которая спрашивает пользователя, хочет ли он преобразовать единицу измерения в десятичной или градусной единицах GPS. Затем они нажимают на соответствующую кнопку, и им предлагается заполнить форму для преобразования.

Я знаю, что я слишком подробно разбираюсь со своими потребностями, а не задаю конкретный вопрос, но я надеюсь, что, предоставив то, что я в конечном итоге хочу иметь здесь, вы сможете указать мне правильное направление.

Большое спасибо всем, кто помог мне с этим.

================================

Второй дополнительный раунд

Я безуспешно пытался перейти на Java 6, поэтому я застрял с 5. В таком случае, не могли бы вы рассказать о добавлении

java.util.regex.Pattern.matches("^\\s*$", textField.getText());

Импортирую ли я его в начале кода? Если да, могу ли я импортировать только в класс AwesomeGUI.java?

Или этот код работает по-другому?

большое спасибо, presto

Ответы [ 2 ]

3 голосов
/ 22 февраля 2011

Я постараюсь найти время, чтобы углубиться в это, но мы начнем с минимального решения, чтобы все работало вместе.

Для начала нам нужно получить классы для компиляции.В Java вся обработка должна выполняться внутри методов.Вы уже знакомы с методом public static void main(String[] args) {}.Теперь мы собираемся создать методы внутри ваших классов

import java.util.Scanner;
import java.text.*;

public class InputDecimal {

  Scanner input = new Scanner(System.in);
  DecimalFormat decConv = new DecimalFormat("00.00");

  public void askForDecimalCoordinateAndPrintDegrees() {

    double dec;
    double remain;
    double remaindb;
    double mindb;
    int deg;
    int min;
    double sec;

    System.out.print("Enter the Decimal Coordinate: ");
    dec = input.nextDouble();

    deg = (int) dec;
    remain = dec - deg;
    remaindb = remain * 60;
    min = (int) remaindb;
    mindb = remaindb - min;
    sec = mindb * 60;

    System.out.printf("Your Coordinate Equals " + deg + "\u00b0" + min + "'"
        + decConv.format(sec) + "\"\n");

  }
}

и

import java.util.Scanner;
import java.text.*;

class InputDegree {

  Scanner input = new Scanner(System.in);
  DecimalFormat decConv = new DecimalFormat("000.000");

  double deg;
  double min;
  double sec;
  double degadd;
  double minup;
  double minadd;
  double dec;

  public void askForDegreesAndPrintDecimal() {

    System.out.print("Enter the Degrees: ");
    deg = input.nextDouble();

    System.out.print("Enter the Minutes: ");
    min = input.nextDouble();

    System.out.print("Enter the Seconds: ");
    sec = input.nextDouble();

    degadd = sec / 60;
    minup = degadd + min;
    minadd = minup / 60;
    dec = deg + minadd;

    System.out.printf("Your Converted Coordinate Equals " + decConv.format(dec)
        + "\n");

  }

}

. Вы увидите, что мы добавили метод с именем askForDecimalCoordinateAndPrintDegrees в класс InputDecimal и askForDegreesAndPrintDecimal к классу InputDegrees.Эти методы содержат все функции, которые у вас были раньше в вашем основном методе.

Затем мы начинаем работать с нашим графическим интерфейсом (вы уверены, что хотите графический интерфейс, а не просто текстовый интерфейс).В графическом интерфейсе у нас будет метод main, который вызывает и InputDecimal, и InputDegree.Прежде чем вызывать их, мы должны создать их экземпляры, поскольку добавленные нами методы не объявлены как статические.

Первая версия может выглядеть примерно так

public class TheAwesomeGUI {

  public static void main(String[] args) {
    InputDecimal decimalInput = new InputDecimal();
    InputDegree degreeInput = new InputDegree();

    decimalInput.askForDecimalCoordinateAndPrintDegrees();
    degreeInput.askForDegreesAndPrintDecimal();
  }

}

Теперь мы сразу замечаем, что в коде есть какой-то запах: у нас тоже есть методы с и и их именем.Легко видеть, что эти методы делают больше, чем одно.Через некоторое время мы можем прийти к выводу, что в наших руках есть понятие, называемое координатой.Давайте уточним, что это?

  • Координата представляет широту или долготу
  • Координата может быть представлена ​​в виде десятичного числа
  • Координата может быть представлена ​​в градусах
  • Пользователь должен иметь возможность вводить координаты, используя любое из его представлений
  • Пользователь должен иметь возможность печатать координаты, используя любое из своих представлений
  • Существуют формулы для преобразования между двумякоторые вы реализовали в своем коде.

Теперь мы можем создать класс, который представляет концепцию координаты:

import java.text.DecimalFormat;

public class Coordinate {

  DecimalFormat decConv = new DecimalFormat("00.00");

  double dec;
  double remain;
  double remaindb;
  double mindb;
  int deg;
  int min;
  double sec;

  double degadd;
  double minup;
  double minadd;

  public static Coordinate createFromDecimal(double decimalValue) {
    return new Coordinate(decimalValue);
  }

  public static Coordinate createFromDegrees(int degrees, int minutes,
      double seconds) {
    return new Coordinate(degrees,minutes,seconds);
  }

  private Coordinate(double decimalValue) {
    dec = decimalValue;
    deg = (int) dec;
    remain = dec - deg;
    remaindb = remain * 60;
    min = (int) remaindb;
    mindb = remaindb - min;
    sec = mindb * 60;
  }

  private Coordinate(int degrees, int minutes, double seconds) {
    deg = degrees;
    min = minutes;
    sec = seconds;
    degadd = sec / 60;
    minup = degadd + min;
    minadd = minup / 60;
    dec = deg + minadd;
  }

  public void printCoordinateAsDegrees() {
    System.out.printf("Your Coordinate Equals " + deg + "\u00b0" + min + "'"
        + decConv.format(sec) + "\"\n");

  }

  public void printCoordinateAsDecimal() {
    System.out.printf("Your Converted Coordinate Equals " + decConv.format(dec)
        + "\n");
  }

}

Что мы сделали, так это то, что мы объединили классы InputDegree и InputDecimal таким образом, что у нас есть два отдельных метода для Coordinate, один создает новую координату на основе десятичной координаты, а другой использует градусы.Я также сделал немного магии: я спрятал конструкторы от глаз и вместо этого использовал статические методы, потому что казалось более разборчивым иметь Coordinate.createFromDecimal (decimal), который новый Coordinate (decimal).

Теперь, когда мы изменили классы InputDegree и InputDecimal, нам нужно изменить наш класс GUI.

import java.util.Scanner;

public class TheAwesomeGUI {

  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    Coordinate coordinate;

    coordinate = askCoordinateInDecimal(input);
    coordinate.printCoordinateAsDegrees();

    coordinate = askCoordinateInDegrees(input);
    coordinate.printCoordinateAsDecimal();
  }

  protected static Coordinate askCoordinateInDecimal(Scanner input) {
    System.out.print("Enter the Decimal Coordinate:  ");
    double dec = input.nextDouble();
    return Coordinate.createFromDecimal(dec);
  }

  protected static Coordinate askCoordinateInDegrees(Scanner input) {
    System.out.print("Enter the Degrees: ");
    int deg = input.nextInt();

    System.out.print("Enter the Minutes: ");
    int min = input.nextInt();

    System.out.print("Enter the Seconds: ");
    double sec = input.nextDouble();

    return Coordinate.createFromDegrees(deg, min, sec);
  }

}

Вы могли заметить, что мы переместили ввод в класс GUI.Мы также создали удобные методы для создания координат на основе пользовательского ввода.Для пользователя программа выглядит точно так же, как и раньше.В качестве дополнительного преимущества мы теперь можем печатать координаты, которые были определены в десятичном виде как в десятичном, так и в градусном выражении.Представь себе!

Далее мы сделаем очень маленькое изменение.Есть несколько переменных, которые используются, чтобы помочь преобразовать градусы в десятичную и наоборот.Я хотел бы уменьшить их охват, т.е. я хотел бы скрыть их из виду, если они нам не нужны.

import java.text.DecimalFormat;

public class Coordinate {

  DecimalFormat decConv = new DecimalFormat("00.00");

  double dec;
  int deg;
  int min;
  double sec;

  public static Coordinate createFromDecimal(double decimalValue) {
    return new Coordinate(decimalValue);
  }

  public static Coordinate createFromDegrees(int degrees, int minutes,
      double seconds) {
    return new Coordinate(degrees,minutes,seconds);
  }

  private Coordinate(double decimalValue) {
    dec = decimalValue;
    deg = (int) dec;
    double remain = dec - deg;
    double remaindb = remain * 60;
    min = (int) remaindb;
    double mindb = remaindb - min;
    sec = mindb * 60;
  }

  private Coordinate(int degrees, int minutes, double seconds) {
    deg = degrees;
    min = minutes;
    sec = seconds;
    double degadd = sec / 60;
    double minup = degadd + min;
    double minadd = minup / 60;
    dec = deg + minadd;
  }

  public void printCoordinateAsDegrees() {
    System.out.printf("Your Coordinate Equals " + deg + "\u00b0" + min + "'"
        + decConv.format(sec) + "\"\n");

  }

  public void printCoordinateAsDecimal() {
    System.out.printf("Your Converted Coordinate Equals " + decConv.format(dec)
        + "\n");
  }

}

Затем мы замечаем, что в классе Coordinate все еще есть две обязанности.Он должен конвертировать координаты между десятичными и градусами и печатать их.Давайте избавимся от печати.Когда мы избавимся от печати, мы должны быть уверены, что сможем каким-то образом получить данные координат.Вот почему мы добавим методы, которые сообщат нам значение координат в десятичном виде и значение координат в градусах, минутах и ​​секундах.

public class Coordinate {

  double dec;
  int deg;
  int min;
  double sec;

  public static Coordinate createFromDecimal(double decimalValue) {
    return new Coordinate(decimalValue);
  }

  public static Coordinate createFromDegrees(int degrees, int minutes,
      double seconds) {
    return new Coordinate(degrees,minutes,seconds);
  }

  private Coordinate(double decimalValue) {
    dec = decimalValue;
    deg = (int) dec;
    double remain = dec - deg;
    double remaindb = remain * 60;
    min = (int) remaindb;
    double mindb = remaindb - min;
    sec = mindb * 60;
  }

  private Coordinate(int degrees, int minutes, double seconds) {
    deg = degrees;
    min = minutes;
    sec = seconds;
    double degadd = sec / 60;
    double minup = degadd + min;
    double minadd = minup / 60;
    dec = deg + minadd;
  }

  public int getDegrees() {
    return deg;
  }

  public int getMinutes() {
    return min;
  }

  public double getSeconds() {
    return sec;
  } 

  public double asDecimal() {
    return dec;
  }

}

Теперь печать должна выполняться в нашем графическом интерфейсе

import java.text.DecimalFormat;
import java.util.Scanner;

public class TheAwesomeGUI {

  static DecimalFormat decConv = new DecimalFormat("00.00");

  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    Coordinate coordinate;

    coordinate = askCoordinateInDecimal(input);
    printCoordinateAsDegrees(coordinate);
    coordinate = askCoordinateInDegrees(input);
    printCoordinateAsDecimal(coordinate);
  }

  public static void printCoordinateAsDecimal(Coordinate coordinate) {
    System.out.printf("Your Converted Coordinate Equals " + decConv.format(coordinate.asDecimal())
        + "\n");
  }

  private static void printCoordinateAsDegrees(Coordinate coordinate) {
    System.out.printf("Your Coordinate Equals " + coordinate.getDegrees() + "\u00b0" + coordinate.getMinutes() + "'"
        + decConv.format(coordinate.getSeconds()) + "\"\n");
  }

  private static Coordinate askCoordinateInDecimal(Scanner input) {
    System.out.print("Enter the Decimal Coordinate:  ");
    double dec = input.nextDouble();
    return Coordinate.createFromDecimal(dec);
  }

  private static Coordinate askCoordinateInDegrees(Scanner input) {
    System.out.print("Enter the Degrees: ");
    int deg = input.nextInt();

    System.out.print("Enter the Minutes: ");
    int min = input.nextInt();

    System.out.print("Enter the Seconds: ");
    double sec = input.nextDouble();

    return Coordinate.createFromDegrees(deg, min, sec);
  }

}

Мы добавили удобные методы printCoordinateAsDegrees и printCoordinateAsDecimal, чтобы содержать реализацию, которую мы только что взяли из класса Coordinate.Но наличие метода, который печатает и форматирует, усложнит нашу работу, когда мы создадим настоящий графический интерфейс - давайте разделим эти задачи!Ниже приведена выдержка из класса GUI

private static void printCoordinateAsDecimal(Coordinate coordinate) {
    System.out.printf("Your Converted Coordinate Equals "
        + asDecimal(coordinate) + "\n");
  }

  private static void printCoordinateAsDegrees(Coordinate coordinate) {
    System.out.printf("Your Coordinate Equals " + asDegrees(coordinate) + "\n");
  }

  private static String asDegrees(Coordinate coordinate) {
    return coordinate.getDegrees() + "\u00b0" + coordinate.getMinutes() + "'"
        + decConv.format(coordinate.getSeconds()) + "\"";
  }

  private static String asDecimal(Coordinate coordinate) {
    return decConv.format(coordinate.asDecimal());
  }

Теперь я чувствую себя немного увереннее в написании графического интерфейса для этого. Обязательно читайте о Swing в свободное время, потому что некоторые магические шаги должны произойти. Итак, вот грязная версия

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class AwesomeGUI {

  private JFormattedTextField minutesInput;
  private JFormattedTextField decimalInput;
  private JFormattedTextField secondsInput;
  private JFormattedTextField degreesInput;

  private final class DecimalToDegreesListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent event) {
      if (decimalInput.getText().isEmpty()) {
        return;
      }
      try {
        JFormattedTextField.AbstractFormatter f = decimalInput.getFormatter();
        Coordinate coordinate = Coordinate.createFromDecimal(((Number) f
            .stringToValue(decimalInput.getText())).doubleValue());
        degreesInput.setText(String.valueOf(coordinate.getDegrees()));
        minutesInput.setText(String.valueOf(coordinate.getMinutes()));
        secondsInput.setText(decConv.format(coordinate.getSeconds()));
      } catch (ParseException e) {
        throw new IllegalArgumentException(
            "Decimal input was not a decimal number");
      }
    }
  }

  private final class DegreesToDecimalListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent event) {
      // Require all input fields to be filled
      if (degreesInput.getText().isEmpty() || minutesInput.getText().isEmpty()
          || secondsInput.getText().isEmpty()) {
        return;
      }
      try {
        int degrees = Integer.valueOf(degreesInput.getText());

        int minutes = Integer.valueOf(minutesInput.getText());
        JFormattedTextField.AbstractFormatter f = secondsInput.getFormatter();

        double seconds = ((Number) f.stringToValue(secondsInput.getText()))
            .doubleValue();
        Coordinate coordinate = Coordinate.createFromDegrees(degrees, minutes,
            seconds);
        decimalInput.setText(decConv.format(coordinate.asDecimal()));
      } catch (ParseException e) {
        throw new IllegalArgumentException(
            "Seconds input was not a decimal number");
      }
    }
  }

  static DecimalFormat decConv = new DecimalFormat("00.00");
  private JButton convertDegreesToDecimal;
  private JButton convertDecimalToDegreesButton;

  public AwesomeGUI() {
    JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);

    window.setLayout(new GridLayout(2, 1));

    window.add(createDecimalInputPanel());
    window.add(createDegreesInputPanel());

    convertDecimalToDegreesButton
        .addActionListener(new DecimalToDegreesListener());
    convertDegreesToDecimal.addActionListener(new DegreesToDecimalListener());

    window.pack();

  }

  protected JPanel createDecimalInputPanel() {
    JPanel decimalPanel = new JPanel();
    decimalPanel.setLayout(new FlowLayout());
    decimalInput = new JFormattedTextField(
        DecimalFormat.getInstance());
    decimalInput.setColumns(5);
    convertDecimalToDegreesButton = new JButton("convert");
    decimalPanel.add(new JLabel("Decimal Coordinate"));
    decimalPanel.add(decimalInput);
    decimalPanel.add(convertDecimalToDegreesButton);
    return decimalPanel;
  }

  private JPanel createDegreesInputPanel() {
    JPanel degreesPanel = new JPanel();
    degreesPanel.setLayout(new FlowLayout());
    degreesInput = new JFormattedTextField(
        NumberFormat.getIntegerInstance());
    degreesInput.setColumns(2);
    minutesInput = new JFormattedTextField(
        NumberFormat.getIntegerInstance());
    minutesInput.setColumns(2);
    secondsInput = new JFormattedTextField(
        DecimalFormat.getInstance());
    secondsInput.setColumns(5);

    convertDegreesToDecimal = new JButton("convert");
    degreesPanel.add(new JLabel("degrees"));
    degreesPanel.add(degreesInput);
    degreesPanel.add(new JLabel("\u00b0 minutes"));
    degreesPanel.add(minutesInput);
    degreesPanel.add(new JLabel("' seconds"));
    degreesPanel.add(secondsInput);
    degreesPanel.add(new JLabel("\""));
    degreesPanel.add(convertDegreesToDecimal);

    return degreesPanel;
  }

  public static void main(String[] args) {
    new AwesomeGUI();
  }

}

И после небольшой уборки мы получаем следующее. Это немного дольше и, надеюсь, намного понятнее. Я пытался поднять уровень абстракции, создавая больше методов для повторяющихся задач и группирования инструкций. Например, когда мне нужно десятичное значение JFormattedTextField, я бы лучше сказал asDouble(textField) или doubleValueOf(textField), чем ((Number)(textField.getFormatter().stringAsValue(textField.getText())).doubleValue()

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.Format;
import java.text.NumberFormat;
import java.text.ParseException;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class AwesomeGUI {

  private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("00.00");
  private static final int COLUMNS_IN_INTEGER_INPUT_TEXTFIELD = 2;
  private static final int COLUMNS_IN_DECIMAL_INPUT_TEXTFIELD = 4;

  private JFormattedTextField degreesInDecimalInput;

  private JFormattedTextField degreesInput;
  private JFormattedTextField minutesInput;
  private JFormattedTextField secondsInput;

  private JButton convertDegreesToDecimalButton;
  private JButton convertDecimalToDegreesButton;

  public static void main(String[] args) {
    new AwesomeGUI();
  }

  public AwesomeGUI() {
    final JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    window.setLayout(new GridLayout(2, 1));
    window.add(createDecimalInputPanel());
    window.add(createDegreesInputPanel());

    convertDecimalToDegreesButton
        .addActionListener(new DecimalToDegreesListener());
    convertDegreesToDecimalButton.addActionListener(new DegreesToDecimalListener());

    window.setVisible(true);
    window.pack();
  }

  private JPanel createDecimalInputPanel() {
    final JPanel decimalPanel = createElementsInDecimalInputPanel();
    layoutElementInDecimalInputPanel(decimalPanel);
    return decimalPanel;
  }

  private JPanel createElementsInDecimalInputPanel() {
    final JPanel decimalPanel = new JPanel();
    degreesInDecimalInput = createDecimalInput();
    convertDecimalToDegreesButton = new JButton("convert");
    return decimalPanel;
  }

  private void layoutElementInDecimalInputPanel(final JPanel decimalPanel) {
    decimalPanel.setLayout(new FlowLayout());
    decimalPanel.add(new JLabel("Decimal Coordinate"));
    decimalPanel.add(degreesInDecimalInput);
    decimalPanel.add(convertDecimalToDegreesButton);
  }

  private JPanel createDegreesInputPanel() {
    final JPanel degreesPanel = createElementsInDegreesInputPanel();
    layoutElementsInDegreesInputPanel(degreesPanel);
    return degreesPanel;
  }

  private JPanel createElementsInDegreesInputPanel() {
    final JPanel degreesPanel = new JPanel();
    degreesInput = createIntegerInput();
    minutesInput = createIntegerInput();
    secondsInput = createDecimalInput();
    convertDegreesToDecimalButton = new JButton("convert");
    return degreesPanel;
  }

  private void layoutElementsInDegreesInputPanel(final JPanel degreesPanel) {
    degreesPanel.setLayout(new FlowLayout());
    degreesPanel.add(new JLabel("Degrees: "));
    degreesPanel.add(degreesInput);
    degreesPanel.add(new JLabel("\u00b0"));
    degreesPanel.add(minutesInput);
    degreesPanel.add(new JLabel("'"));
    degreesPanel.add(secondsInput);
    degreesPanel.add(new JLabel("\""));
    degreesPanel.add(convertDegreesToDecimalButton);
  }

  private JFormattedTextField createDecimalInput() {
    return createFormattedTextInput(DecimalFormat.getInstance(),
        COLUMNS_IN_DECIMAL_INPUT_TEXTFIELD);
  }

  private JFormattedTextField createIntegerInput() {
    return createFormattedTextInput(NumberFormat.getIntegerInstance(),
        COLUMNS_IN_INTEGER_INPUT_TEXTFIELD);
  }

  private JFormattedTextField createFormattedTextInput(Format format,
      int columns) {
    final JFormattedTextField textField = new JFormattedTextField(format);
    textField.setColumns(columns);
    return textField;
  }

  private double asDouble(final JFormattedTextField decimalInput) {
    return formattedValueOf(decimalInput).doubleValue();
  }

  private int asInteger(final JFormattedTextField integerInput) {
    return formattedValueOf(integerInput).intValue();
  }

  private Number formattedValueOf(final JFormattedTextField numericInput) {
    try {
      final JFormattedTextField.AbstractFormatter f = numericInput
          .getFormatter();
      return ((Number) f.stringToValue(numericInput.getText()));
    } catch (ParseException e) {
      throw new IllegalStateException(
          "Text field did not contain a number with the correct format. Value found was "
              + numericInput.getText(), e);
    }
  }

  private boolean containsAnEmptyValue(JFormattedTextField... textFields) {
    for (JFormattedTextField textField : textFields) {
      if (textField.getText().isEmpty()) {
        return true;
      }
    }
    return false;
  }

  private final class DecimalToDegreesListener implements ActionListener {

    @Override
    public void actionPerformed(final ActionEvent event) {
      if (containsAnEmptyValue(degreesInDecimalInput)) {
        return;
      }
      final Coordinate coordinate = Coordinate
          .createFromDecimal(asDouble(degreesInDecimalInput));
      degreesInput.setText(String.valueOf(coordinate.getDegrees()));
      minutesInput.setText(String.valueOf(coordinate.getMinutes()));
      secondsInput.setText(DECIMAL_FORMAT.format(coordinate.getSeconds()));
    }
  }

  private final class DegreesToDecimalListener implements ActionListener {

    @Override
    public void actionPerformed(final ActionEvent event) {
      if (containsAnEmptyValue(degreesInput, minutesInput, secondsInput)) {
        return;
      }
      final Coordinate coordinate = Coordinate.createFromDegrees(
          asInteger(degreesInput), asInteger(minutesInput),
          asDouble(secondsInput));
      degreesInDecimalInput.setText(DECIMAL_FORMAT.format(coordinate.asDecimal()));
    }
  }

}

Главное, на что нужно обратить внимание при переходе на графический интерфейс на основе Swing, это то, что поток управления инвертирован. Сначала мы определили для себя, какие методы были вызваны и в каком порядке. Используя Swing, мы даем управление инфраструктуре Swing, которая вызывает наши методы для событий, сгенерированных пользователем, например, щелчок кнопки. Для каждого события, которое вы хотите обработать, вы должны определить слушателя, который получает уведомление о событии.

Другое дело, что нам нужно написать довольно много кода для описания пользовательского интерфейса. Пользовательский интерфейс определяется с использованием набора иерархических элементов. Вверху у нас есть окно. Окно разделено на сетку с двумя строками и столбцом. Верхняя ячейка сетки заполнена тремя элементами, текущими слева направо. Нижняя ячейка похожа, но содержит еще несколько предметов.

0 голосов
/ 22 февраля 2011

Ваш код даже компилируется?Вы должны приложить все усилия, чтобы опубликовать исполняемый или хотя бы скомпилированный код, задавая вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...