Java画图
编写一个程序,一个大椭圆包括黑色轮廓和用你最喜欢的颜色填充。即使调整窗口的大小椭圆应该接触窗口边界
Hint: themethods getWidth() and getHeight() of the Frame class can be used to get thecurrent width and height of the frame.
Provide 2 classes:
· EllipseComponent
o ExtendsJComponent andoverrides the paintComponent(Graphics g) method
· EllipseViewer.
o Makes a new EllipseComponent and adds it to a JFrame. 展开
看来你从未动过手解决未知问题,只会做练习?
这里已经提示了怎么做,你只需要先了解基本的 Swing 中的 JLabel/JFrame 怎么用,然后自己自己做一个 EllipseComponent 覆盖它的 paintComponent(Graphics g) 方法,使用一个像 Eclipse 这样的开发工具 IDE,在 g 后面打个点就有提示这个 Graphics 有什么方法可用,里面就有2D绘图的方法。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class EllipseViewer extends JFrame {
private static final long serialVersionUID = 5929654695935454925L;
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager
.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
public void run() {
EllipseViewer app = new EllipseViewer();
}
});
}
private JPanel panel;
public EllipseViewer() {
add(getPanel());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
System.out.println("Window Resized: Frame");
}
});
}
public JPanel getPanel() {
if (panel == null) {
panel = new EllipseComponent();
panel.setPreferredSize(new Dimension(300, 200));
panel.setBackground(Color.RED);
}
return panel;
}
class EllipseComponent extends JPanel {
private static final long serialVersionUID = -1744557274793554529L;
protected void paintComponent(Graphics g) {
System.out.println("Paint component");
Rectangle clientArea = this.getBounds();
int height = clientArea.height - 1;
int width = clientArea.width - 1;
// set foreground color
g.setColor(Color.BLACK);
// draw cycle/ellipse
g.drawOval(0, 0, width, height);
// set foreground color
g.setColor(Color.ORANGE);
// fill it, we give 1 pixel as line width.
g.fillOval(1, 1, width - 2, height - 2);
}
}
}
很多语句都没见过,能不能给简单点的,刚学这个。
这里面没几个东西啊。
main 函数是测试用的,简单吧。
EllipseViewer() 构造函数,是这个 EllipseViewer 类的主体。
class EllipseComponent extends JPanel 这是个内部类,你也可以把它拿到外部成为一个独立的 public class 文件。
getPanel() 方法是创建一个 EllipseComponent 对象实例。
代码中关键的 paintComponent 已经给了说明,先得到当前这个 component 的矩形区域和高和宽,然后分2步,第一步,先设置前景色为黑色并画封闭弧线并填充黑色;第二步,设置前景色为橙色并填充橙色到,不过这次填充的区域的高宽比前一次各减少了1,这样,就留下了1个像素的黑色外框。
serialVersionUID 可以忽略,完全不相关的,是自动生成的一部分。
最主要的绘图部分添加了注释。
protected void paintComponent(Graphics g) {
System.out.println("Paint component");
//得到当前组件可见矩形区域
Rectangle clientArea = this.getBounds();
int height = clientArea.height - 1;
int width = clientArea.width - 1;
// 设置前景色为黑色
g.setColor(Color.BLACK);
// 画闭合弧线,当宽和高相等时是一个圆,不相等时是个椭圆
g.drawOval(0, 0, width, height);
// 再改前景色为橙色
g.setColor(Color.ORANGE);
// 填充区域并留出1个像素的黑色外框
g.fillOval(1, 1, width - 2, height - 2);
}