输出可以到控制台,也可以到文件,还可以到窗口等。自我感觉输出到窗口会高大上一点,输出到窗口主要用到 Swing 工具包。
首先怎么让程序运行后出现窗口呢。
package frame;
import javax.swing.JFrame;
public class SimpleFrame extends JFrame{
private static final long serialVersionUID = 1L; //该行可要可不要
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
public SimpleFrame(){
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); //设置窗口大小
}
}
package frame;
import java.awt.*;
import javax.swing.*;
public class SimpleWindow {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run(){
SimpleFrame frame = new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); //显示窗口
}
});
}
}
运行程序后,一个 300 x 200 的窗口就在左上角出现了。但是窗口里什么都没有,仅仅是一个窗口,空的。
是不是应该在窗口上加个标题,加些文字,加些图形?
package draw;
import javax.swing.JFrame;
public class DrawFrame extends JFrame{
public DrawFrame(){
add(new DrawComponent());
pack();
}
}
package draw;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
public class DrawComponent extends JComponent{
private static final int DEFAULT_WIDTH = 400;
private static final int DEFAULT_HEIGHT = 500;
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
double leftX = 100;
double topY = 200;
double width = 200;
double height = 150;
//写文字
String words = "some shapes";
Font f = new Font("serif", Font.BOLD, 36); //设置字体(字体、加粗、字号)
g2.setFont(f);
g2.setPaint(Color.red); //设置颜色
g2.drawString(words, 100, 50);
//画 200 x 150 矩形
Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height);
g2.setPaint(Color.red); //改变颜色,不设置将使用前面使用过的颜色
g2.draw(rect); //边框变色
g2.setPaint(Color.gray);
g2.fill(rect); //矩形里面上色,fill 用来填充一个封闭的图形
//画椭圆
Ellipse2D ellipse = new Ellipse2D.Double();
ellipse.setFrame(rect); //以矩形框画椭圆
g2.setPaint(Color.black);
g2.draw(ellipse);
//画圆
double centerX = rect.getCenterX();
double centerY = rect.getCenterY();
double radius = 150;
Ellipse2D circle = new Ellipse2D.Double();
circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);
g2.draw(circle);
//画直线,指定起点和终点
g2.draw(new Line2D.Double(leftX, topY, leftX + width, topY + height));
g2.draw(new Line2D.Double(leftX, topY + height, leftX + width, topY));
}
public Dimension getPreferredSize(){
return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
}
下面这个是测试类
package draw;
import java.awt.EventQueue;
import javax.swing.JFrame;
public class DrawTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frame = new DrawFrame();
frame.setTitle("DrawTest"); //设置标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
运行结果如下图:
这里有一个不足的地方就是图形文字等的大小和位置是固定的,当拖动窗口放大或缩小的时候,图形文字等不会跟着窗口同比例改变。
这有点尴尬,要怎么做才能使得图形和文字等跟着窗口的改变而同比例改变呢。
答案是让图形文字等的尺寸数据等跟窗口的尺寸数据关联起来就可以啦。
如画直线的语句改成下面的句子:
g2.draw(new Line2D.Double(getWidth() / 2, getHeight() / 4, getWidth() / 2, 3 * getHeight() / 4));
g2.draw(new Line2D.Double(getWidth() / 4, getHeight() / 2, 3 * getWidth() / 4, getHeight() / 2));
这样的话,无论你怎么拖动窗口放大或是缩小,这两条直线都是窗口中心的 十 字。