반응형
Swing프로젝트를 진행하는데,
이미 한번 다뤄보았던 부분이고 해서 전에 해보지 않았던 걸 구현해보고 싶어서 고민했었는데,
안드로이드의 커스텀 리스트 뷰를 구현해보는게 재미도 있고 보는맛도 있겠다 싶어 구현하게 되었습니다.
음... swing으로 치자면 다이나믹 스크롤 패널 정도로 될려나요..?ㅎㅎ
우선 데이터를 담을 Bean은 아래와 같습니다.
리스트에 붙일 아이템 패널은 아래와 같습니다.
더보기
import javax.swing.JPanel;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
import com.swing.model.student.TeammateReviewDBAction;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class CommentPanelItem extends JPanel {
private JLabel lblName;
private JLabel lblImage;
private JTextField tfContent;
private JButton btnSubmit;
//패널의 정보들을 저장
String sender;
int selectedTeamNo;
String taget;
String name;
BufferedImage bufferedImage;
String content = "";
//생성시 패널의 아이템을 부착하고 id, name, photo, content를 저장
public CommentPanelItem(String sender, int selectedTeamNo, String taget, String name, BufferedImage photo, String content) {
setBackground(Color.WHITE);
addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
tfMouseExited();
}
});
this.sender = sender;
this.selectedTeamNo = selectedTeamNo;
this.taget = taget;
this.name = name;
this.bufferedImage = photo;
this.content = content;
setBorder(null);
setLayout(null);
setSize(390,80);
add(getLblName());
add(getLblImage());
add(getTfContent());
add(getBtnSubmit());
}
private JLabel getLblName() {
if (lblName == null) {
lblName = new JLabel(name);
lblName.setForeground(new Color(0, 102, 204));
lblName.setHorizontalAlignment(SwingConstants.CENTER);
lblName.setBounds(14, 58, 61, 16);
}
return lblName;
}
private JLabel getLblImage() {
if (lblImage == null) {
lblImage = new JLabel();
lblImage.setBounds(14, 6, 61, 48);
lblImage.setHorizontalAlignment(SwingConstants.CENTER);
ImageIcon imageIcon = new ImageIcon(bufferedImage);
Image image = imageIcon.getImage().getScaledInstance(lblImage.getWidth(), lblImage.getHeight(), Image.SCALE_SMOOTH);
lblImage.setIcon(new ImageIcon(image));
}
return lblImage;
}
private JTextField getTfContent() {
if (tfContent == null) {
tfContent = new JTextField();
tfContent.setForeground(new Color(0, 102, 204));
tfContent.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
tfClieckEvnet();
}
});
tfContent.setBounds(87, 6, 297, 48);
tfContent.setColumns(10);
tfContent.setText(content);
}
return tfContent;
}
private JButton getBtnSubmit() {
if (btnSubmit == null) {
btnSubmit = new JButton("등록");
btnSubmit.setForeground(Color.WHITE);
btnSubmit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
submitComment();
}
});
btnSubmit.setOpaque(true);
btnSubmit.setBorderPainted(false);
btnSubmit.setBackground(new Color(0, 102, 204));
btnSubmit.setBounds(305, 52, 75, 22);
btnSubmit.setVisible(false);
}
return btnSubmit;
}
//text feild 클릭시 버튼 가시화
private void tfClieckEvnet() {
System.out.println("[해당 패널 정보]" + taget + " : " + content);
btnSubmit.setVisible(true);
}
//마우스가 패널 밖으로 갔을 시, content 초가화 및 등록버튼 비가시화
private void tfMouseExited() {
tfContent.setText(content);
btnSubmit.setVisible(false);
}
//등록바튼 클릭시, 저장된 content값이 없다면 Insert, 있다면 update=
private void submitComment() {
TeammateReviewDBAction gi = new TeammateReviewDBAction();
String input = tfContent.getText();
System.out.println("taget : " + taget + ", comment = " + input);
if (content == null) {
System.out.println("[run insert]");
if (gi.commentInsert(selectedTeamNo, taget, sender, input.trim())) {
content = input.trim();
tfContent.setText(input.trim());
JOptionPane.showMessageDialog(null, "코멘트 등록 성공");
} else {
JOptionPane.showMessageDialog(null, "코멘트 등록 실패");
}
} else {
System.out.println("[run update]");
if(gi.commentUpdate(selectedTeamNo, taget, sender, input.trim())) {
content = input.trim();
tfContent.setText(input.trim());
JOptionPane.showMessageDialog(null, "코멘트 등록 성공");
}
JOptionPane.showMessageDialog(null, "코멘트 등록 실패");
}
}
}
특이사항으로는 MouseExited를 이용해서 마우스커서가 패널안에 있어야 등록버튼이 생기도록 구성하였습니다.
코멘트는 하나밖에 달지 못하는 팀원평가이기 떄문에 등록시 db에 해당인원에게 작성한게 없다면 insert,
있다면 update가 작동하도록 분기했습니다.
리스트의 아이템을 불러오는 패널은 다음과 같습니다.
더보기
import javax.swing.JButton;
import javax.swing.JPanel;
import com.swing.model.student.TeammateReviewDBAction;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
public class CommentPanel extends JPanel {
String loginedId;
//bean 갯수 카운트
int panelItemCount = 0;
int selectedTeamNol;
//최초 생성시 db에서 데이터를 받아와 bean의 갯수대로 CommentPanelItem을 생성, 부착
public CommentPanel(String loginedId, int selectedTeamNo) {
this.loginedId = loginedId;
this.selectedTeamNol = selectedTeamNo;
//bean 배열 생성 및 db로부터 데이터 가져와 채움
TeammateReviewDBAction dba = new TeammateReviewDBAction();
ArrayList<CommentBean> cbs = dba.getCommentPanelData(loginedId, selectedTeamNo);
panelItemCount = cbs.size();
//반환된 bean 개수에 맞춰 row 생성
setLayout(new GridLayout(panelItemCount,1));
//반환된 bean으로 CommentPanelItem 생성
for (int i = 0; i < panelItemCount; i++) {
CommentPanelItem customListViewItem
= new CommentPanelItem(loginedId, selectedTeamNo, cbs.get(i).id, cbs.get(i).name, cbs.get(i).photo, cbs.get(i).content);
add(customListViewItem);
}
}
public CommentPanel get() {
return this;
}
}
이 코멘트 패널을 스크롤 패널에 붙이면 동적으로 리스트 아이템이 부착되는
다이나믹 스크롤 뷰가 탄생하게 됩니다.
나머지 코드들도 올릴거 있나 하고 봤는데 사실 swing은 뭐 별거 없는지라...
건질게 이거밖에 없네요 ㅎ
반응형
'Language > JAVA' 카테고리의 다른 글
RxJAVA - Subject 간단 정리 (0) | 2021.10.17 |
---|---|
JSON 데이터로 JAVA 클래스파일 생성하기 feat.retrofit2 (0) | 2021.06.23 |
java swing 효율 최대로! widowBuilder (0) | 2021.05.28 |
조금 늦게 쓰는 swing 팀 프로젝트 후기 (0) | 2021.05.27 |
Mac에서 java 개발환경 구축하기 (이클립스 설치) (0) | 2021.03.26 |