gpt4 book ai didi

java - 如何在 JFrame 中停止和恢复绘画?

转载 作者:行者123 更新时间:2023-11-30 02:30:01 25 4
gpt4 key购买 nike

我想在 JFrame 中绘制 10 条线。但在线条之间,我想等待输入来绘制下一条线。此代码用于一次绘制所有 10 条线:

import java.awt.Graphics;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestPaint extends JPanel {

/**
*
*/
private static final long serialVersionUID = 1L;

public void paintComponent(Graphics g){
for(int i = 0; i < 10; i++){
g.drawLine(100, i*100, 300, i*100);

}
}

public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TestPaint p = new TestPaint();
f.add(p);
f.setSize(1000, 1000);
f.setVisible(true);
}

}

现在我尝试了这个,但它不起作用:

import java.awt.Graphics;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestPaint extends JPanel {

/**
*
*/
private static final long serialVersionUID = 1L;

public void paintComponent(Graphics g){
for(int i = 0; i < 10; i++){
g.drawLine(100, i*100, 300, i*100);
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TestPaint p = new TestPaint();
f.add(p);
f.setSize(1000, 1000);
f.setVisible(true);
}

}

发生的情况是,我按 Enter 4 次,没有任何反应,而在第 5 次输入时,所有 10 行都出现了,这看起来很奇怪。现在我读到可能存在线程问题,但我不知道如何实现我想要的。

编辑:我不一定需要使用java。如果用另一种语言更容易实现这一点,例如python 我也会很高兴。

最佳答案

您可以通过向面板添加 KeyListener 来响应按键事件,并将当前绘制的线条存储在列表中。当用户按下 Enter 键时,使用 list.size() 修改 x/y 坐标,以在最后一行之前绘制下一行。

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestPanel extends JPanel {

public List<Line2D> lines = new ArrayList<Line2D>();

public TestPanel() {
this.setFocusable(true);
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
lines.add(new Line2D.Double(100, lines.size() * 100,
300, lines.size() * 100));
repaint();
}
}
});
}

public void paintComponent(Graphics g) {
for(Line2D line : lines) {
g.drawLine((int) line.getX1(), (int) line.getY1(), (int) line.getX2(),
(int) line.getY2());
}
}

public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TestPanel p = new TestPanel();
f.add(p);
f.setSize(1000, 1000);
f.setVisible(true);
}
}

关于java - 如何在 JFrame 中停止和恢复绘画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44527627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com