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

时间:2017-06-13 17:07:14

标签: java swing

我想在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。如果用另一种语言更容易实现这一点,例如我也很高兴。

1 个答案:

答案 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);
    }
}