如何制作将所有输入值存储到字符串中的 Swing 应用程序?
How do I make a Swing app that stores all the inputed values into a string?
我正在制作一个为用户输入的坐标绘制形状的应用程序。我需要有两个输入字段,每次用户点击 ENTER 时将输入的数字存储到数组中,然后连接坐标以绘制线条。
我查找了一些 swing 教程并且已经看到最好的选择是 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 坐标输入字段,两者都应该存储在单独的数组中,这些数组将被迭代以绘制连接它们的线。
我将尝试回答您的问题,并通过以下示例向您展示如何实现这一点。这些是我对您的代码所做的更改。
我使用 JTextField
而不是 JFormatedTextField
因为 JFormatedTextField
对于像这样的简单程序来说太复杂了。
我使用 java.util.List
而不是数组,因为 List
可以动态改变它的大小。这在这里很有用,因为用户可以添加很多坐标。
我写了 class 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));
}
}
}
我正在制作一个为用户输入的坐标绘制形状的应用程序。我需要有两个输入字段,每次用户点击 ENTER 时将输入的数字存储到数组中,然后连接坐标以绘制线条。
我查找了一些 swing 教程并且已经看到最好的选择是 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 坐标输入字段,两者都应该存储在单独的数组中,这些数组将被迭代以绘制连接它们的线。
我将尝试回答您的问题,并通过以下示例向您展示如何实现这一点。这些是我对您的代码所做的更改。
我使用 JTextField
而不是 JFormatedTextField
因为 JFormatedTextField
对于像这样的简单程序来说太复杂了。
我使用 java.util.List
而不是数组,因为 List
可以动态改变它的大小。这在这里很有用,因为用户可以添加很多坐标。
我写了 class 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));
}
}
}