use*_*944 1 java graphics swing paintcomponent
对于问题,我必须在屏幕上绘制一个圆,其中心为(280,300),半径为50。提示说:圆是具有相同宽度和高度的椭圆形。该圆的中心在此椭圆的NW角以下50像素,在其NW角右侧50像素。
有TryoutPanel类:
import java.awt.*;
import javax.swing.*;
public class TryoutPanel extends JPanel{
private Color myColor;
public TryoutPanel(Color c){
myColor = c;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
setForeground(myColor);
g.drawString("top",10,50);
g.drawLine(10,60, 200,60);
g.drawString("middle",10,80);
g.drawLine(10,90, 200,90);
g.drawString("bottom",10,110);
g.drawLine(10,120, 200,120);
g.drawRect(200,300,100,50);
g.drawOval(200,300,100,50);
for(int j = 0; j < 9; j++)
g.drawOval(50,200, 10 + 20*j, 210 - 20*j);
}
}
Run Code Online (Sandbox Code Playgroud)
我必须在下面填写代码:
public void paintComponent(Graphics g){
super.paintComponent(g);
setForeground(myColor);
//INSERT CODE HERE
Run Code Online (Sandbox Code Playgroud)
我试过了:
g.drawOval(280,300,50,50);
但是它说我使用了不正确的参数。我究竟做错了什么。
的x/ y参数drawOval是绘制椭圆的上/左角
为了能够在周围围绕中心点绘制圆230x300,您需要从每个点减去半径,然后生成宽度和高度(直径)的两倍,...
g.drawOval(230 - radius, 300 - radius, radius * 2, radius * 2);
Run Code Online (Sandbox Code Playgroud)
因此,此示例基本在的点周围绘制了一个矩形230x300,宽度/高度为200(半径= 100),并绘制了穿过该点的线以说明椭圆然后围绕其绘制的中心点...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TryoutOval {
public static void main(String[] args) {
new TryoutOval();
}
public TryoutOval() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TryoutPanel(Color.RED));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TryoutPanel extends JPanel {
private Color myColor;
public TryoutPanel(Color c) {
myColor = c;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int centerX = 280;
int centerY = 300;
int radius = 50;
int diameter = radius * 2;
int x = centerX - radius;
int y = centerY - radius;
g.setColor(Color.BLACK);
g.drawRect(x, y, diameter, diameter);
g.drawLine(x, y, x + diameter, y + diameter);
g.drawLine(x + diameter, y, x, y + diameter);
g.setColor(myColor);
g.drawOval(x, y, diameter, diameter);
g.fillOval(centerX - 5, centerY - 5, 10, 10);
}
}
}
Run Code Online (Sandbox Code Playgroud)
哦,这setForeground(myColor);是任何paint方法中的一个可怕的坏主意,因为它将导致paint每次调用该方法时将一个事件添加到事件队列中,这将导致永无休止的重画请求,最终将消耗您的CPU