Welcome to My World (www.dgmayor.com)

소프트웨어/자바 GUI & C# 등...

51. 자바 마우스 우측 버튼 클릭

dgmayor 2022. 5. 24. 17:56
728x90
 



guiex.SwingTest.java

package guiex; import java.awt.Frame; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /* 프레임에 팝업 메뉴 - 마우스 오른쪽으로 이벤트 동작 */ public class SwingTest { public static void main(String[] args) { Frame f = new Frame("팝업 메뉴"); f.setSize(300,300); // 팝업 메뉴를 만들어 놓자 PopupMenu pMenu = new PopupMenu("edit"); // Label을 붙일 수 있다. // 아이템은 제일 말단 // 아이템을 가지고 있는 애는 메뉴 MenuItem miCut = new MenuItem("Cut"); MenuItem miCopy = new MenuItem("Copy"); MenuItem miPaste = new MenuItem("Paste"); pMenu.add(miCut); pMenu.add(miCopy); pMenu.add(miPaste); // 그리고 팝업 메뉴를 프레임에 붙여놓자 f.add(pMenu); // 이벤트 단 /*f.addMouseListener(new MouseListener() { // 땠을 때 @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } // 누르고 있을 때 @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } // 마우스 커서를 벗어나는 것? @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } // 마우스 커서를 댔을 때 힌트 등 같은 걸 주는 것 @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } // 눌렀다 땠을 때 @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } });*/ // 이벤트 단 f.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { System.out.println(e.getModifiers()); // 4, 8, 16이 클릭마다 다르게 나온다. // 마우스 버튼을 눌렀을 때 마우스 버튼에 매칭되어있는 값을 얘기하는게 getModifiers if(e.getModifiers()==MouseEvent.BUTTON3_MASK){// 오른쪽 마우스 눌렀을 때만 반응해라 // 팝업 메뉴를 나타나게 해라 pMenu.show(f, e.getX(), e.getY()); } } @Override public void mouseClicked(MouseEvent e) { // 팝업 메뉴를 나타나게 해라 // pMenu.show(f, 30, 40); // 언제 발동을 하는지 e한테 추출해 본다 System.out.println(e); // java.awt.event.MouseEvent[MOUSE_CLICKED,(99,62),absolute(99,62),button=3,modifiers=Meta+Button3,clickCount=1] on frame0 // button=3 <-- 마우스 오른쪽, 왼쪽, 가운데 숫자 // clickCount=1 <-- 클릭 한번 clickCount=2 <-- 더블클릭 // pMenu.show(f, e.getX(), e.getY()); 2번 클릭해야 하는 귀찮음이 있다. mousePressed()메서드에 재정의 하자 } }); // 이벤트가 걸리면 나타나게 해주자! f.setVisible(true); } } <<console 출력값>> 16 <-- 왼쪽 마우스 클릭 (좌표?) (왼쪽마우스) (한번클릭) java.awt.event.MouseEvent[MOUSE_CLICKED,(117,150),absolute(117,150),button=1,modifiers=Button1,clickCount=1] on frame0 8 <-- 가운데 마우스 클릭 (가운데마우스) (더블클릭) java.awt.event.MouseEvent[MOUSE_CLICKED,(117,150),absolute(117,150),button=2,modifiers=Alt+Button2,clickCount=2] on frame0 4 <-- 오른쪽 마우스 클릭

- 실행 결과

오른쪽 마우스를 누르면 팝업메뉴가 뜬다.




guiex.GridLayoutTest.java

package guiex; import java.awt.Button; import java.awt.Frame; import java.awt.GridLayout; public class GridLayoutTest { public static void main(String[] args) { Frame f = new Frame("GridLayout"); // 격자무늬, 그물 f.setSize(150,150); f.setLayout(new GridLayout(3, 2)); // 3줄 각 줄마다 2칸씩 f.setLayout(new GridLayout(2, 3)); // 2줄 각 줄마다 3칸씩 f.add(new Button("1")); f.add(new Button("2")); f.add(new Button("3")); f.add(new Button("4")); f.add(new Button("5")); // f.add(new Button("1")); f.setVisible(true); } }

- 실행 결과

프레임 사이즈에 맞게 지정해 준 행과 열의 사이즈도 자동으로 맞춰준다.




guiex.GridCalcTest.java  :  미완성

package guiex; import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class GridCalcTest { int num = 0; int num2 = 0; String sum; int result = 0; int firstCheck = 0; int secondCheck = 0; TextField tf; public GridCalcTest() { Frame f = new Frame("계산기"); tf = new TextField("0"); // Hint 처음에 나오는 값 f.setBounds(300, 300, 250, 200); f.add("North", tf); // 두 인자의 위치를 바꿔도 된다. 하지만 North상수를 주의해서 써야한다. Panel numPanel = new Panel(); Button[] numButtons = null; // (h = horiz..) (v = Vertical...) numPanel.setLayout(new GridLayout(4, 5, 4, 5)); //hgqp, vgqp 좌우의 갭을 어떻게 잡을꺼냐 위아래의 갭을 어떻게 잡을거냐 numPanel.setBackground(Color.LIGHT_GRAY); f.add("Center",numPanel); // 버튼에 들어갈 문자열 만들기 String numStr[] = { "7","8","9","/","CE", "4","5","6","*","BS", "1","2","3","-","1/x", "0","+/-",".","+","=" }; numButtons = new Button[numStr.length]; // 버튼 20개 for(int i=0; i<numStr.length; i++){ numButtons[i] = new Button(numStr[i]); // 버튼 만들고 제목 넣기 numButtons[i].setForeground(Color.blue); // 전경색(forGround) 파란색 numPanel.add(numButtons[i]); // 버튼을 패널에 하나씩 추가하기! } f.setVisible(true); // 이벤트 단!! - 내부 클래스로 리스너를 만들었다. for(int i=0; i<numStr.length; i++){ numButtons[i].addActionListener(new ButtonListener()); } } class ButtonListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); System.out.println(cmd); if(cmd.equals("1")){ //tf.setText(1); // 설계가 잘못됐다. main메서드에서 처리했을 때의 얘기 // The method setText(String) in the type TextField is not applicable for the arguments (int) }else if(cmd.equals("2")){ }else if(cmd.equals("+")){ }else if(cmd.equals("=")){ // 미해결!! } } } // 메인 함수는 static이여서 변수 에러가 난다. 그래서 메인 함수는 경량화. 클래스 생성자에서 다 처리하자 // Cannot make a static reference to the non-static field tf public static void main(String[] args) { // tf 변수 에러가 나서 생성자에 담는다. /*Frame f = new Frame("계산기"); tf = new TextField("0"); // Hint 처음에 나오는 값 f.setBounds(300, 300, 190, 160); f.add("North", tf); // 두 인자의 위치를 바꿔도 된다. 하지만 North상수를 주의해서 써야한다. Panel numPanel = new Panel(); Button[] numButtons = null; // (h = horiz..) (v = Vertical...) numPanel.setLayout(new GridLayout(4, 5, 4, 5)); //hgqp, vgqp 좌우의 갭을 어떻게 잡을꺼냐 위아래의 갭을 어떻게 잡을거냐 numPanel.setBackground(Color.LIGHT_GRAY); f.add("Center",numPanel); // 버튼에 들어갈 문자열 만들기 String numStr[] = { "7","8","9","/","CE", "4","5","6","*","BS", "1","2","3","-","1/x", "0","+/-",".","+","=" }; // 버튼 20개 for(int i=0; i<numStr.length; i++){ numButtons = new Button[numStr.length]; numButtons[i] = new Button(numStr[i]); numButtons[i].setForeground(Color.blue); //전경색? numPanel.add(numButtons[i]); } f.setVisible(true);*/ new GridCalcTest(); } }

- 실행 결과




paintFrame.PaintFrameTest.java

package paintFrame; import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.HeadlessException; import java.awt.Label; import java.awt.Scrollbar; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class PaintFrameTest { public static void main(String[] args) { PaintFrame p = new PaintFrame("페인트 프레임"); // 프레임 중에 그래픽 담당 객체가 있다. // 걔를 불러내서 해당 프레임에 넣을 컴포넌트의 색깔을 // 일괄적으로 맞춰줄 수 있다. Graphics g = p.getGraphics(); // public void paint(Graphics g){} 의 그래픽스. // frame에 걸려있으면 자동으로 호출하는 콜백 메서드이다. // 그런데 메인함수에는 Frame을 부르지 않았기 때문에 Graphics 객체만 호출한거다. g.setColor(Color.red); // g로 그리는 모든 요소를 빨강색으로 칠한다. // g는 그래픽과 관련된 것. 선, 도형, 색..Graphics for(int i=0; true; i+=p.speed){ // p.speed는 sb에 사용자가 드래그하는 값으로 설정된다. // 애니메이션 효과를 주려면 try~catch문 try{Thread.sleep(100);/* 0.1초*/} catch(Exception e){} // g를 반복할때마다 이전 좌료와 값을 없애야 한다. g.clearRect(0, 0, 300, 300); // 프레임의 내용을 refresh한다. g.drawString("Hello", i, 150); // i값이 증가하도 150범위에 다 다르면 // 다시 0으로 순환되게 만든다. i = (i<300)?i:0; } } } class PaintFrame extends Frame{ int speed = 1; // orientation = 방향(가로,세로) (스크롤바 모양)(스크롤바 범위) Scrollbar sb = new Scrollbar(Scrollbar.HORIZONTAL, 0, 5, 0, 50); Label lblSpeed = new Label("Speed : 1"); /*public PaintFrame() { // 위의 클래스에서 PaintFrame p = new PaintFrame(); 인스턴스 생성하면 기본생성자가 호출되서 }*/ // 기본생성자엔 아무 내용이 없으니까 불러오지 못했다. //alt+shift+s 후 c public PaintFrame(String title)/* throws HeadlessException */{ super(title); lblSpeed.setBackground(Color.yellow); lblSpeed.setSize(65, 15); lblSpeed.setLocation(10, 30); // 스크롤바가 들어 갈 위치와 크기를 설정한다. sb.setSize(260, 20); sb.setLocation(20, 250); // sb추가, lbl 추가 add(sb); add(lblSpeed); // 이벤트 단 // sb에 리스너를 걸자! Adjustment = 조정자 sb.addAdjustmentListener(new MyHandler()); // 내부클래스로 만들어보자 // 이 프레임에도 닫기(windowClosing)만 걸자! addWindowListener(new MyHandler()); setSize(300, 300); setLayout(null); setVisible(true); setResizable(false); } // 내부 핸들러 클래스로 만들자 // 1. WindowListener 인터페이스 구현 후 8개 재정의 // 2. windowAdapter 상속 후 원하는 메서드 재정의 class MyHandler extends WindowAdapter implements AdjustmentListener{ @Override public void windowClosing(WindowEvent e) { System.exit(0); } @Override public void adjustmentValueChanged(AdjustmentEvent e) { // 값이 변경될때마다 (스크롤바의 바가 변경될때마다 호출되는 콜백이다) speed=sb.getValue(); lblSpeed.setText("Speed : "+speed); } } }

- 실행 결과

스크롤바가 오른쪽으로 갈수록 hello로 글씨는 빨리 움직인다.
스크롤바가 hello speed 반영

 


tabpanel.TabbedPanelTest.java

package tabpanel; import java.awt.TextArea; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTabbedPane; public class TabbedPanelTest extends JFrame { // 인스턴스 변수 ImageIcon icon1, icon2, icon3, tabIcon; JButton b1, b2, b3; // JFrame이면 J를 붙여서 쓰는게 좋다. JTabbedPane jp; public TabbedPanelTest() { super("탭패인 테스트"); icon1 = new ImageIcon("image1.jpg"); tabIcon = new ImageIcon("image2.jpg"); b1 = new JButton("사진1", icon1); b2 = new JButton("사진2", icon1); JPasswordField jpField = new JPasswordField("암호넣기"); jpField.setEchoChar('*'); jpField.selectAll(); jpField.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { jpField.setText(""); } }); String pw = jpField.getSelectedText(); // 변수 미 사용 jp = new JTabbedPane(); jp.addTab("탭1", new ImageIcon("")/* icon1 */, b1); jp.addTab("탭2", new JPanel().add(new TextArea(7, 20))); jp.addTab("세번째", tabIcon, b2, "탭사진도 추가합니다. 마우스 가만히 올려 놓으세요 말풍선"); jp.addTab("탭4", jpField); add(jp); // 닫을 때 메모리에서 완전 사라짐 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(300, 300, 300, 300); setVisible(true); } public static void main(String[] args) { new TabbedPanelTest(); } }

- 실행 결과

탭으로 나눠 각각의 기능을 수행할 수 있다.






 

728x90