8. 마우스를 찍어 중심을 잡고 드래깅하여 놓으면 원을 그리는 코드를 작성하라.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
public class eight extends JFrame{
MyPanel Panel=new MyPanel();
public eight() {
setTitle("마우스로 원 그리기");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(Panel);
setSize(700,500);
setVisible(true);
}
class MyPanel extends JPanel{
private Vector<Point> start=new Vector<Point>();
private Vector<Point> end=new Vector<Point>();
public MyPanel() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
start.add(e.getPoint());
}
public void mouseReleased(MouseEvent e) {
end.add(e.getPoint());
repaint();
}
}
);}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
for(int i=0;i<start.size();i++) {
Point s=start.get(i);
Point e=end.get(i);
double radius=Math.sqrt(Math.pow(Math.abs(s.getX()-e.getX()),2)+Math.pow(Math.abs(s.getY()-e.getY()),2));
g.drawOval((int)Math.abs(s.getX()-radius), (int)(Math.abs(s.getY()-radius)), (int)radius*2, (int)radius*2);
}
}}
public static void main(String[]args) {
new eight();
}
}
9. JLabel을 상속받고 배경색이 항상 파란색인 BlueLabel 컴포넌트를 작성하라. setBackground() 메소드를 이용하여도 BlueLabel은 배경색을 변경할 수 없도록 하라. BlueLabel을 만드는 방법은 두 가지가 있다. BlueLabel의 paintComponent()메소드를 오버라이딩하여 강제로 파란 배경색을 칠하는 방법과 setBackground()메소드를 오버라이딩하여 외부에서 칠하는 색을 무시하고 파란색으로 칠하는 방법이다. 두 방법 중 한 가지를 사용하라.
import javax.swing.*;
import java.awt.*;
public class nine extends JFrame{
public nine() {
setTitle("Blue Label 만들기");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new FlowLayout());
BlueLabel bl=new BlueLabel("hello");
bl.setBackground(Color.red);//배경색 변경
bl.setForeground(Color.white);
bl.setOpaque(true);
BlueLabel bbl=new BlueLabel("Big Hello");
bbl.setFont(new Font("Serif",Font.ROMAN_BASELINE,50));
bbl.setForeground(Color.magenta);
bbl.setBackground(Color.red);//배경색 변경
bbl.setOpaque(true);
c.add(bl);
c.add(bbl);
setSize(400,300);
setVisible(true);
}
class BlueLabel extends JLabel{
public BlueLabel(String s) {
super(s);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.blue);
}
}
public static void main(String[]args) {
new nine();
}
}
10. paintComponent()를 사용하여 이미지를 패널에 출력할 때 4등분하고, 서로 상, 하, 좌, 우 10픽셀씩 떨어져서 그려지도록 하라. 이미지는 컴포넌트를 사용하지 말고 그래픽으로만 구현하라. 동일한 이미지를 4번 로딩하여도 안 된다. GridLayout을 사용해도 안 된다.
import javax.swing.*;
import java.awt.*;
public class ten extends JFrame{
private MyPanel panel=new MyPanel();
public ten(){
setTitle("그래픽 이미지 연습");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(panel);
setSize(730,490);//360 240
setVisible(true);
}
class MyPanel extends JPanel{
private ImageIcon icon=new ImageIcon("images/022.jpg");
private Image img=icon.getImage();
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img,0,0,getWidth()/2-5,getHeight()/2-5, 0,0,960,540, this);//앞의 좌표 4개 패널구역/뒤의 좌표 4개 사진구역
g.drawImage(img, getWidth()/2+5,0,getWidth(),getHeight()/2-5, 960, 0, 1920, 540, this);
g.drawImage(img,0,getHeight()/2+5,getWidth()/2-5,getHeight(),0,540,960,1080,this);
g.drawImage(img,getWidth()/2+5,getHeight()/2+5,getWidth(),getHeight(),960,540,1920,1080,this);
}
}
public static void main(String[]args) {
new ten();
}
}
11. 파이 차트를 만들어보자. 다음 그림과 같이 apple, chrrey, strawberry, prune의 4가지 종류의 과일 판매량을 입력하고 <Enter>키를 치면 전체 판매량에서 백분율(%)을 계산하여 문자열과 파이 차트로 동시에 출력되도록 하라. JTextField 창에 <Enter>키를 치면 Action 이벤트가 발생하는데 Action 리스너를 작성하여 백분율을 계산하고 파이 차트를 그리면 된다.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class eleven extends JFrame{
JPanel jp=new JPanel();
MyPanel panel=new MyPanel();
String[]fruits= {"apple","cherry","strawberry","prune"};
JLabel[]jl=new JLabel[4];
JLabel[]jl2=new JLabel[4];
JTextField []jt=new JTextField[4];
int []key=new int[4];//입력값
int []ans=new int[4];//백분율
int []ang=new int[4];//각도
Color []col= {Color.red,Color.blue,Color.magenta,Color.yellow};
public eleven() {
setTitle("파이 차트 그리기");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new BorderLayout());
jp.setLayout(new FlowLayout());
jp.setBackground(Color.LIGHT_GRAY);
for(int i=0;i<fruits.length;i++) {
jl[i]=new JLabel(fruits[i]);
jt[i]=new JTextField(5);
jt[i].addActionListener(new MyActionListener());
jp.add(jl[i]);
jp.add(jt[i]);
}
panel.setLayout(null);
for(int i=0;i<fruits.length;i++) {
jl2[i]=new JLabel();
panel.add(jl2[i]);
jl2[i].setSize(120,20);
jl2[i].setFont(new Font("Serif",Font.BOLD,16));
jl2[i].setLocation(50+i*130, 0);
}
c.add(jp,BorderLayout.NORTH);
c.add(panel,BorderLayout.CENTER);
setSize(600,500);
setVisible(true);
}
class MyPanel extends JPanel{
public MyPanel() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
System.out.println("click");
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillArc(getWidth()/2-150, 100, 300, 300, 0, ang[0]);
g.setColor(Color.blue);
g.fillArc(getWidth()/2-150, 100, 300, 300, ang[0], ang[1]);
g.setColor(Color.magenta);
g.fillArc(getWidth()/2-150, 100, 300, 300, ang[0]+ang[1], ang[2]);
g.setColor(Color.yellow);
g.fillArc(getWidth()/2-150, 100, 300, 300, ang[0]+ang[1]+ang[2], ang[3]);
}
}
class MyActionListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
double sum=0;
for(int i=0;i<key.length;i++) {
key[i]=Integer.parseInt(jt[i].getText());
sum+=key[i];
}
for(int i=0;i<key.length;i++) {
ans[i]=(int) Math.round(key[i]/sum*100);
ang[i]=(int)Math.round(ans[i]*3.6);
}
for(int i=0;i<fruits.length;i++) {
jl2[i].setText(fruits[i]+" "+ans[i]+"%");
jl2[i].setForeground(col[i]);
}
panel.repaint();
}
}
public static void main(String[]args) {
new eleven();
}
}
'JAVA > 공부' 카테고리의 다른 글
14. 고급 스윙 컴포넌트 (0) | 2021.02.15 |
---|---|
13. 스레드와 멀티태스킹 (0) | 2021.02.03 |
11. 기본적인 스윙 컴포넌트와 활용 (0) | 2021.01.23 |
10. 자바의 이벤트 처리 (0) | 2021.01.19 |
9. 자바 GUI 기초, AWT와 스윙(Swing) (0) | 2021.01.19 |