如何制作将所有输入值存储到字符串中的Swing应用程序?

时间:2019-01-26 16:28:36

标签: java arrays swing draw

我正在制作一个为用户输入的坐标绘制形状的应用程序。我需要有两个输入字段,每当用户按下ENTER键然后将坐标连接到绘制线时,这些输入字段便将输入的数字存储到数组中。

我在寻找一些摇摆教程,并且已经看到最好的选择是JFormatedTextField。我设法制作了一个lambda方法,当按ENTER键时,该方法会打印出nuber,但是我不知道如何在lambda之外使用输入的值,也无法在其中创建数组,因为我得到一个错误,变量必须是final.so问题是,如何将输入的值存储到数组中,以及如何使它在每次按ENTER键时画一条线?

 Number[] values = new Number[5];
 for (int i = 0; i< 5;i++) {
    fieldXbox.addActionListener(e -> {
       System.out.println("Handled by Lambda listener");
       Number coordinateX = (Number) fieldXbox.getValue();
       values[i]= coordinateX;
       System.out.println("coordinateX" + coordinateX);
    });

对于x坐标应该有一个输入字段,对于y坐标应该有一个输入字段,这两个字段都应存储在单独的数组中,然后进行迭代以绘制连接它们的线。

1 个答案:

答案 0 :(得分:0)

我将尝试回答您的问题,并通过以下示例向您展示如何实现此目的。这些是我对您的代码所做的更改。

我用JTextField代替了JFormatedTextField,因为对于这样的简单程序,JFormatedTextField太复杂了。

我使用了java.util.List而不是数组,因为List可以动态更改其大小。这在这里很有用,因为用户可以添加许多坐标。

我写了Canvas类,上面画了线。

如果有不清楚的地方,请在评论中让我知道。

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class DrawLines {

  public static void main(String[] args) {

    List<Integer> xValues = new ArrayList<>();
    List<Integer> yValues = new ArrayList<>();

    JTextField fieldXbox = new JTextField();
    fieldXbox.addActionListener(e -> {
      System.out.println("Handled by Lambda listener");
      Integer coordinateX = Integer.parseInt(fieldXbox.getText());
      xValues.add(coordinateX);
      System.out.println("coordinateX" + coordinateX);
    });

    JTextField fieldYbox = new JTextField();
    fieldYbox.addActionListener(e -> {
      System.out.println("Handled by Lambda listener");
      Integer coordinateY = Integer.parseInt(fieldYbox.getText());
      yValues.add(coordinateY);
      System.out.println("coordinateY" + coordinateY);
    });

    Canvas canvas = new Canvas(xValues, yValues);
    canvas.setBorder(BorderFactory.createLineBorder(Color.black));

    JButton drawButton = new JButton("Draw");
    drawButton.addActionListener(e -> canvas.repaint());

    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().setLayout(new GridBagLayout());
    f.getContentPane().add(fieldXbox, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
    f.getContentPane().add(fieldYbox, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
    f.getContentPane().add(drawButton, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
    f.getContentPane().add(canvas, new GridBagConstraints(0, 1, 3, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
    f.setBounds(300, 200, 500, 400);
    f.setVisible(true);
  }
}

class Canvas extends JPanel {
  private List<Integer> xCoordinates;
  private List<Integer> yCoordinates;

  Canvas(List<Integer> xCoordinates, List<Integer> yCoordinates) {
    this.xCoordinates = xCoordinates;
    this.yCoordinates = yCoordinates;
  }

  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (xCoordinates.size() != yCoordinates.size()) {
      throw new IllegalStateException("Difference in number of x coordinates and y coordinates." +
          " xCoordinates=" + xCoordinates + " yCoordinates=" + yCoordinates);
    }

    for (int i = 0; i < xCoordinates.size() - 1; i++) {
      g.drawLine(xCoordinates.get(i), yCoordinates.get(i), xCoordinates.get(i+1), yCoordinates.get(i+1));
    }
    if (!xCoordinates.isEmpty()) {
      g.drawLine(xCoordinates.get(xCoordinates.size() - 1), yCoordinates.get(yCoordinates.size() - 1),
          xCoordinates.get(0), yCoordinates.get(0));
    }
  }
}