java绘制函数不起作用
我使用java绘制椭圆并通过线连接它们,当我扫描变量时,paint函数根本不起作用java绘制函数不起作用,java,swing,user-interface,Java,Swing,User Interface,我使用java绘制椭圆并通过线连接它们,当我扫描变量时,paint函数根本不起作用 import java.awt.Color; import javax.swing.JFrame; import java.awt.Graphics; import java.awt.Paint; import java.util.Random; import java.util.Scanner; import javax.swing.JOptionPane; public class Main extends
import java.awt.Color;
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Paint;
import java.util.Random;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class Main extends JFrame {
public Main (){
setTitle("Graph");
setSize(1000, 1000);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void paint (Graphics g,int x,int z,int y) {
g.fillOval(x, x+20, 40, 40);
g.drawLine(x+10, x+50,x+z+10, z+30);
g.fillOval(x+z, z, 40, 40);
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int x = scan.nextInt();
int z =scan.nextInt();
int y =scan.nextInt();
x=x+1;
z=z+1;
y=y+1;
Main m=new Main();
Graphics g=m.getGraphics();
m.paint(g, x, z, y);
}
}
必须重写JFrame的绘制方法。除非你这样做,否则它不会在画框上作画, 这是一个演示
public class Main extends JFrame {
int x;
int y;
int z;
public Main(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
setTitle("Graph");
setSize(1000, 1000);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
@Override
public void paint(Graphics g) {
g.fillOval(x, x + 20, 40, 40);
g.drawLine(x + 10, x + 50, x + z + 10, z + 30);
g.fillOval(x + z, z, 40, 40);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int x = scan.nextInt();
int z = scan.nextInt();
int y = scan.nextInt();
x = x + 1;
z = z + 1;
y = y + 1;
Main m = new Main(x, y, z);
}
}
图形g=m.getGraphics;这并不是定制绘画是如何在Swing中完成的,除了能够返回null之外,它只是上一次绘画的快照,可以在任何时候进行绘制
public void paint Graphics g,int x,int z,int y{不是在绘制过程中调用的方法。Java并没有神奇地知道这个方法可以用于绘制,您需要告诉它
此外,您不应该将基于控制台的输入与GUI混合,选择其中一个
首先看一看
有关Swing中绘画工作方式的更多详细信息
您应该避免直接绘制到顶级容器(如JFrame),除了您实际上没有向框架添加任何新功能之外,它们不是双缓冲的顶级容器,并且在更新过程中可能会导致闪烁,JFrame、JWindow和JApplet具有JRootPane和内容窗格,有时还可以使用玻璃窗格在框架和用户之间,这可能会导致任何数量的绘画问题
更好的解决方案是基于类似JPanel的内容创建自定义组件,并覆盖其paintComponent,确保在执行任何自定义绘制之前调用super.paintComponent
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Main101 {
public static void main(String[] args) {
new Main101();
}
public Main101() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private int x = 10;
private int z = 10;
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.fillOval(x, x + 20, 40, 40);
g2d.drawLine(x + 10, x + 50, x + z + 10, z + 30);
g2d.fillOval(x + z, z, 40, 40);
g2d.dispose();
}
}
}
下次请花点时间选择合适的标题和正确的代码格式。好的,我会的,这是我第一次,它怎么不工作?它做什么?你为什么给我们看这么多代码?只给我们一个我第一次的答案抱歉,如果你知道我如何工作,请告诉我好的,我会的,这是我第一次,不客气!下一步t时间请按照建议阅读MCVE。