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

标签 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);
}

}

发生的情况是,我按 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/

相关文章:

java - 对 Java 方法签名的完全限定引用

java - 通用方法类型参数确定

java - 我们可以再次使用相同的 websocket 连接吗?

java - 堆叠 JLayer 类(到 JPanel)

Java 动态加载一个类

java - 将所有输入转换为大写

java - ArrayList 对对象的引用

java - Wildfly 域模式附加验证问题

java - 无法将 JComponent 添加到 JPanel

swing - Javax.Swing;如何创建不同类的对象并分配从 jframe 收到的变量?概念问题