java. Swing 컴포넌트 및 그래픽스 관련한 간단한 예제들



  • Graphics2D 알파값 조정
import java.awt.*; 
 
public class AlphaImage extends Frame {
 
private AlphaComposite alphaComposite = null;
 
private Image testImage = null;
 
public AlphaImage() {
    alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f); //alpha값
    testImage = Toolkit.getDefaultToolkit().getImage("test.jpg"); //원하는 이미지
}
 
public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g; 
    g2.setComposite(alphaComposite);
    g2.drawImage(testImage, 0, 0, this);
}
 
public static void main(String[] args) {
    AlphaImage alphaImage = new AlphaImage();
    alphaImage.setSize(200, 200);
    alphaImage.show();
}
} 

참고 : http://docs.oracle.com/javase/1.3/docs/guide/2d/spec/j2d-awt.fm8.html

  • Graphics2D를 이용한 간단한 이미지 합성과 저장
//배경이미지를 불러온다.
BufferedImage bg = ImageIO.read( new File( "c:/1.jpg" ) );
//그 위에 덮씌울 이미지를 불러온다.
BufferedImage front = ImageIO.read( new File( "c:/2.jpg" ) );
//배경이미지의 크기대로 메모리이미지 크기를 구성한다.
int width = bg.getWidth();
int height = bg.getHeight();
BufferedImage tmp = new BufferedImage( width, height, page.getType() );
//메모리이미지에서 Graphics2D를 얻어온다.
Graphics2D g = tmp.createGraphics();
//메모리이미지에 그림을 그리자. 으싸 으싸~
g.drawImage( bg, null, 0, 0 );
g.drawImage( front, 10, 10, 100, 100, null );
//메모리 이미지를 파일로 저장한다.
File file = new File( "c:/3.jpg" );
ImageIO.write(tmp, "jpeg", file);

  • 문자열 그리기
Font font = Font.createFont( Font.TRUETYPE_FONT, new FileInputStream( "./font/-윤명조130.ttf" ) )
   .deriveFont( ( float ) 30 );
BufferedImage dummyImage = new BufferedImage( 1, 1, BufferedImage.TYPE_INT_RGB );
FontMetrics fm = dummyImage.getGraphics().getFontMetrics( font );
 
String str = "안녕하세요";
BufferedImage bi = new BufferedImage( fm.stringWidth( str ), 30, BufferedImage.TYPE_INT_RGB );
Graphics2D g2 = bi.createGraphics();
g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
g2.setFont( font );
g2.drawString( str, 0, 25 );
FileOutputStream fos = new FileOutputStream( new File( "./result.jpg") );
ImageIO.write( bi, "jpg", fos ); 
System.out.println( "done" );


  • 버튼에 이미지 넣기



  • JRadioButton



  • JCheckBox



  • JMenu



  • JToggleButton



  • JToolBar



  • JSlider



  • 컴포넌트에 보더 만들기



  • JProgressBar



  • JEditorPane



  • JOptionPain


// 메시지 입력받기
String sendMsg = JOptionPane.showInputDialog( 
    this,
    toUser+"님에게 보낼 메시지를 작성해 주세요",
    "개인메시지 보내기",
    JOptionPane.PLAIN_MESSAGE
);
if(sendMsg==null) return; //취소 눌렀을 경우
else if(1>sendMsg.trim().length()) //메시지를 안쓰고 확인 눌렀을 경우
else
 
// 단순경고메시지 띄우기
JOptionPane.showMessageDialog(
    this,
    "메시지를 올바른 형식으로 적지 않으셨습니다. 메시지를 보낼 수 없습니다",
    "메시지 송신 불가",
    JOptionPane.PLAIN_MESSAGE 
);
return;
 
// 버튼들 설정해서 보여주기
String s[] = { "확인", "답장쓰기" };
int i = JOptionPane.showOptionDialog( 
    this,
    displayMsg,
    "메시지 도착",
    JOptionPane.OK_CANCEL_OPTION,
    JOptionPane.PLAIN_MESSAGE,
    null,
    s,
    s[1]
);

  • JTree


  • JTree - 이벤트 처리, 노드 추가 제거

import java.awt.*; import java.awt.event.*; import javax.swing.*; 
import javax.swing.tree.*; import javax.swing.event.*;
public class JTreeTest extends JFrame implements TreeSelectionListener, ActionListener{
 JTree tree;
 DefaultMutableTreeNode root,n1,n2,n3,nn1,nn2;
 JButton b_add, b_del;
 JTextField tf;
 public JTreeTest(){
  setTitle("JTreeTest");
  root=new DefaultMutableTreeNode("먹고싶은 요리");
   n1=new DefaultMutableTreeNode("한국요리"); root.add(n1);
    nn1=new DefaultMutableTreeNode("감자탕"); n1.add(nn1);
    nn2=new DefaultMutableTreeNode("김치찌개"); n1.add(nn2);
   n2=new DefaultMutableTreeNode("중국요리"); root.add(n2);
   n3=new DefaultMutableTreeNode("일본요리"); root.add(n3);
  //최상위 노드를 매개선수로 JTree생성
  tree=new JTree(root);
  tree.addTreeSelectionListener(this);
  Container con=getContentPane();
  con.add(tree,"West");
  tf=new JTextField();
  b_add=new JButton("추가"); b_add.addActionListener(this);
  b_del=new JButton("삭제"); b_del.addActionListener(this);
  JPanel p=new JPanel(new GridLayout(20,1));
  con.add(p);
  p.add(tf); p.add(b_add); p.add(b_del);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setSize(400,600); setVisible(true);
 }
 
 /** ###########################################################
 TreeSelectionListener 구현예제
 ########################################################### **/
 public void valueChanged(TreeSelectionEvent e){
  //비선택->선택 or 선택->비선택의 변화가 있는 노드의 경로를 돌려줌
  TreePath path=e.getPath();
  //현재 선택되어있는 트리 노드 오브젝트 반환, 형변환 필요
  Object o=path.getLastPathComponent();
 }
 /** ###########################################################
 트리에서의 노드 추가제거 구현 이벤트
 ########################################################### **/
 public void actionPerformed(ActionEvent e){
  /** #####################################################
  공통사항
  ##################################################### **/ 
  //현재 선택된 트리의 경로를 얻는다.
  TreePath path=tree.getSelectionPath();
  //현재 선택된 노드를 얻는다.
  DefaultMutableTreeNode node=
   (DefaultMutableTreeNode)path.getLastPathComponent();
  //트리모델을 얻어온다.
  DefaultTreeModel model=(DefaultTreeModel)tree.getModel();
  /** #####################################################
  트리에 노드 추가
  ##################################################### **/  
  if(e.getSource()==b_add){
   //노드를 붙임
   node.add(new DefaultMutableTreeNode(tf.getText().trim()));
   //모델을 리로드해준다.
   model.reload(node);
  }
  /** #####################################################
  트리에서 노드 삭제
  ##################################################### **/ 
  else if(e.getSource()==b_del){
   if(node.isRoot()) return; //루트노드일경우 삭제 안함
   //현재 선택된 노드의 부모노드를 얻어온다.
   DefaultMutableTreeNode parent=
    (DefaultMutableTreeNode)node.getParent();
    //모델에서 현제 노드를 지운다.
    model.removeNodeFromParent(node);
    //부모노드부터 리로드한다.
    model.reload(parent);
  }
 }//actionPerformed()
 public static void main(String args[]){ new JTreeTest(); }



  • JPopupMenu



  • 룩앤필 바꾸기



  • JSplitPane



  • JTabbedPane



  • JInternalFrame



  • JTextPane

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
 
public class TextPaneTest extends JFrame{
 Container rcp;
 JTextPane tp;
 JScrollPane sp;
 StyledDocument sd;
 TextPaneTest(){
  rcp=getContentPane();
  tp=new JTextPane();
  rcp.add(sp=new JScrollPane(tp));
 
  sd=tp.getStyledDocument();
  //스타일 속성들이 담기는 set
  SimpleAttributeSet as=new SimpleAttributeSet();
  //속성들을 세트에 담는다.
  StyleConstants.setForeground(as,Color.red);
  //insertString(int offset, String str, AttributeSet a) 
 
  //StyledDocument에 내용을 추가한다.
  try{ 
   sd.insertString(sd.getEndPosition().getOffset()-1,"가나다\n",as); 
   }catch(Exception ex){ex.printStackTrace();}
 
  try{ 
   sd.insertString(sd.getEndPosition().getOffset()-1,"가나다\n",as); 
   }catch(Exception ex){ex.printStackTrace();}
 
  setBounds(100,100,300,300);
  setVisible(true);
 }
 public static void main(String args[]){
  new TextPaneTest();
 }
}


  • JTable

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
public class MyJTable extends JFrame implements ActionListener{
 JTable table;
 DefaultTableModel model;
 JTextField tf_name,tf_count,tf_email,tf_picture;
 JButton b_save,b_cancel;
 public MyJTable(){
  setTitle("JTable Test");
  JPanel p=new JPanel(new GridLayout(5,2,3,3));
  p.add(new JLabel("파일명: ")); p.add(tf_name=new JTextField());
  p.add(new JLabel("갯수: ")); p.add(tf_count=new JTextField());
  p.add(new JLabel("이메일: ")); p.add(tf_email=new JTextField());
  p.add(new JLabel("사진: ")); p.add(tf_picture=new JTextField());
  p.add(b_save=new JButton("저장")); b_save.addActionListener(this);
  p.add(b_cancel=new JButton("취소"));
  Container con=getContentPane();
  con.add(p,"North");
  String[][] rowData={{"홍길동","21","hong@test.com","hong.gif"},
   {"김민호","20","min@test.com","min.gif"},
   {"이재용","25","lee@test.com","lee.gif"}};
  String colName[]={"이름","나이","이메일","사진"};
  //테이블 모델을 생성
  model=new DefaultTableModel(rowData,colName);
  table=new JTable(model);
  con.add(new JScrollPane(table));
  setSize(600,400); setVisible(true);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
 }
 public void actionPerformed(ActionEvent e){
  if(e.getSource()==b_save){
   String name=tf_name.getText().trim();
   String count=tf_count.getText().trim();
   String email=tf_email.getText().trim();
   String picture=tf_picture.getText().trim();
   String[] data={name,count,email,picture};
   //DefaultTableModel 에 데이터를 추가
   model.addRow(data);
  }
 }
 
 public static void main(String args[]){
  new MyJTable();
 }
}
 
 
//################################################################
// * 추가
// 백터를 이용해서 데이터 추가가 아니라 전체 갱신하는 방식으로 이벤트처리
//################################################################
 
//멤버변수부분
 
JTable table;
Vector columnNames;
Vector rowData;
DefaultTableModel model;
 
 
//생성자부분
//기본테이블모델 생성,적용(데이터 없음)
 
columnNames=new Vector(1,1);
columnNames.add("아이디");
columnNames.add("이름");
columnNames.add("전화번호");
columnNames.add("주소");
rowData=new Vector(1,1);
model=new DefaultTableModel(rowData,columnNames);
table=new JTable(model);
 
 
//이벤트처리부분
//테이블모델을 재정의
 
rowData=new Vector(2,2);
while(rs.next()){
 Vector recordV=new Vector(2,2);
 for(int i=1; i<=4; i++){
  recordV.add(rs.getString(i));
 }
 rowData.add(recordV);
}
model.setDataVector(rowData,columnNames);
table.setModel(model);