我想在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);
}
}
发生的事情是我按下输入4次并且没有任何反应,并且在5日输入所有10行显示,这看起来很奇怪。 现在我读到我可能有一个线程问题,但我不知道如何实现我想要的。
编辑:我不一定需要使用java。如果用另一种语言更容易实现这一点,例如我也很高兴。答案 0 :(得分:2)
您可以通过向面板添加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);
}
}