Java在一帧中画线

Sot*_*m96 1 java swing awt jpanel jframe

我尝试做一件非常简单的事情。在 Main 类中,我为坐标系绘制了 2 条线。在 userPaint 类中,我从 x1 y1 x2 y2 (已初始化)绘制了 1 条线。问题是这 3 条线(坐标系和 x1y1x2y2 线)不在同一个窗口/框架中。编译器创建了 2 个窗口...我该如何解决这个问题?

主要类别:

import static javax.swing.JFrame.EXIT_ON_CLOSE;
import java.awt.*;
import javax.swing.*;

public class Main extends JFrame {

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawLine(20, 80, 20, 200);
        g.drawLine(20, 200, 140, 200);
    }

    public Main(String title){
        super(title);
        setSize(800, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        Main main = new Main("Graph");
        userPaint up = new userPaint();
    }
}
Run Code Online (Sandbox Code Playgroud)

用户绘画类:

import java.awt.*;
import javax.swing.*;

public class userPaint extends JFrame {
    int x1, y1, x2, y2;

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawLine(x1, y1, x2, y2);
    }

    public userPaint(){
        //Gives 4 numbers for points to drawline. Assume that the x1,y1,x2,y2 are given by Scanner.. but im gonna initialize
        x1 = 200;
        y1 = 200;
        x2 = 300;
        y2 = 300;
        setSize(800, 600);
        setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

cop*_*peg 5

  1. 不要直接绘制到 a JFrame,而是绘制到 a ,您可以通过的方法JPanel添加 a 的内容窗格JFrameJFrameadd
  2. paintComponent(1) 中的绘制应该通过重写方法(而不是方法)来完成paint

例如:

public class Painter extends JPanel{

    public Painter(){

    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawLine(20, 80, 20, 200);
        g.drawLine(20, 200, 140, 200);
        g.drawLine(x1, y1, x2, y2);
    }
}

...
JFrame frame = new JFrame("Title");
frame.add(new Painter());
Run Code Online (Sandbox Code Playgroud)

为坐标系绘制 2 条线

您提到了坐标系,因此您可能希望将 x1..y2 值与坐标系的值进行偏移,以便绘制的线落在轴的范围内。举个例子:

        g.drawLine(20, 80, 20, 200);//y-axis
        g.drawLine(20, 200, 140, 200);//x-axis
        g.drawLine(x1 + 20, 200 - y1, x2 + 20, 200 - y2);//offset by coordinate system
Run Code Online (Sandbox Code Playgroud)

上面通过 x 轴的位置偏移 x 值,通过 y 轴的位置偏移 y 值(负数,因此绘图不会反转) - 假设这些值尚未偏移,并且它们的值像素位置是相对于轴的边界的。

最后一点:类名应该大写