窗口输出文字、图形

输出可以到控制台,也可以到文件,还可以到窗口等。自我感觉输出到窗口会高大上一点,输出到窗口主要用到 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));

这样的话,无论你怎么拖动窗口放大或是缩小,这两条直线都是窗口中心的 十 字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值