2016-12-09 1 views
0

필자는 Java Homework를 완료했지만 모든 기본 클래스 (두 개의 개인 클래스 포함)로 통합되었습니다. 클래스를 별도로 처리하여 코드를 좀 더 우아하게 만들려고합니다. 청취자가 기존 패널과 상호 작용하는 데 문제가 있습니다.청취 클래스를 사용하여 모든 청취를 처리합니다.

내가보고있는 주요 부분은 Listener.java에 있습니다. 마우스 클릭과 액션 리스너. 청취자를 트리거하기 위해 클릭 한 버튼의 이름을 가져올 수 있는데, 도움이되지만 Panel 패널에 추가 된 "DrawBoard"패널과 상호 작용할 수는 없습니다.

Window.java :

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Window extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -8255319694373975038L; 

    public static void main(String[] args){ 

     new Window(); 
    } 


    public Window(){ 


     // Adds the custom panel 
     Panel Panel = new Panel(); 
     this.add(Panel); 


     // Basic Window Features 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setSize(800,800); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 


} 

Panel.java :

public class Panel extends JPanel{ 

    public Panel(){ 
     Button testButton = new Button("Test"); 
     DrawBoard drawBoard = new DrawBoard(); 
     Listener listener = new Listener(); 



     this.add(testButton); 
     this.add(drawBoard); 


    } 
} 

Button.java

나는이 상호 작용을 작업 할 수있는 가장 좋은 방법이 무엇인지 궁금하네요

import java.awt.Dimension; 

import javax.swing.JButton; 

public class Button extends JButton{ 


    public Button(String name) { 
     this.setText(name); 
     this.setName((String) name); 
     buttonSettings(); 
    } 

    private void buttonSettings(){ 
     Listener listener = new Listener(); 
     this.addActionListener(listener); 

     int width = 200; 
     int height = 50; 
     Dimension dim = new Dimension(width,height); 
     this.setPreferredSize(dim); 
    } 

} 

DrawBoard. 자바

import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.JPanel; 

public class DrawBoard extends JPanel{ 

    public DrawBoard(){ 
     DrawBoardSettings(); 
    } 

    private void DrawBoardSettings(){ 
     int width = 600; 
     int height = 600; 
     Dimension dim = new Dimension(width,height); 
     this.setPreferredSize(dim); 
     this.setBackground(Color.WHITE); 
    } 
} 

Listener.java 여기

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JComponent; 

public class Listener implements ActionListener, MouseListener { 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     **// Draw a dot at the mouse location of the DrawBoard JPanel that was added by the Panel JPanel that was added by the Window JFrame** 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     String name = ((JComponent) e.getSource()).getName(); 
     **// Draw a rectangle on the DrawBoard JPanel that was added by the Panel JPanel that was added by the Window JFrame** 
    } 

} 

답변

0

일부의 생각 :

  • 는 현재 당신이 리스너 클래스의 여러 경우가 있습니다. 그것은 아마도 당신이 원하는 것이 아닙니다.
  • 관련 : 귀하의 코드는 Listener 클래스가 일부 패널에서 그려야 함을 나타냅니다. 그렇다면 ... 그 청취자는 어떻게 든 그 패널에 액세스을 필요로합니다.

한 가지 방법이 얻을 : 당신은 다음

private final Panel drawingBoard; 
public Listener(Panel drawingBoard) { 
    this.drawingBoard = drawingBoard; 
) 

과의 actionPerformed() 메소드가 그릴 수있는 뭔가가 귀하의 생성자를 변경합니다.

이해해야 할 핵심 사항 : 가지고있는 구성 요소에 대해 명확한 모델을 만들어야합니다. 그리고 그들이 어떻게 서로에 의존하는지. 그게 당신의 구현을 유도하기 때문입니다. 예를 들어, 다른 오브젝트를 작성해야하는 순서에 관한 것입니다. 내 예를 들자면, 먼저 Panel 객체를 생성해야합니다. 그러면 이 표시되고은 해당 패널의 수신기를 생성 할 수 있습니다.

+0

감사합니다. 나는 그저 한 번 수업을 시작했는지 확인한 다음 다른 수업에서 그 첫 번째 인스턴스를 호출하도록했습니다. –

0

다음은 완성 된 프로젝트 코드입니다. 나는 그것을 훨씬 깨끗하고 만들었다 고 생각에만 "청취자"내 문제를 정리 한 번 "drawBoard"라고 :

Window.java :

import javax.swing.JFrame; 


public class Window extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -8255319694373975038L; 

    // initiates the program 
    public static void main(String[] args){ 

     new Window(); 
    } 


    public Window(){ 


     // Adds the custom panel 
     Panel Panel = new Panel(); 
     this.add(Panel); 


     // Basic Window Features 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setSize(800,800); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 


} 

Panel.java을 :

import java.awt.FlowLayout; 
import java.util.ArrayList; 

import javax.swing.JPanel; 

    public class Panel extends JPanel{ 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 5509155261502497671L; 



     public Panel(){ 
      // This is the area where stuff will be drawn 
      DrawBoard drawBoard = new DrawBoard(); 


      // This is the only instance of listener. Buttons now call this variable 
      Listener listener = new Listener(drawBoard); 


      // Invisible Overlay allows me to get mouse listener coordinates for drawing 
      JPanel overlay = new JPanel(); 

      //gets rid of the padding on the invisible overlay layer; 
      FlowLayout layout = (FlowLayout)overlay.getLayout(); 
      layout.setVgap(0); 
      layout.setHgap(0); 

      // The mouse listener is added to the overlay layer rather than the panel to ensure that X,Y coords match the drawboard panel underneath 
      // I could not add the listener to the drawboard panel because the listener requires the drawboard panel to perform. 
      overlay.addMouseListener(listener); 
      overlay.addMouseMotionListener(listener); 
      overlay.add(drawBoard); 


      // Buttons that will appear on the top of the panel 
      ArrayList<Button> TopButtons = new ArrayList<Button>(); 
      TopButtons.add(new Button("Blue", listener)); 
      TopButtons.add(new Button("Green", listener)); 
      TopButtons.add(new Button("Red", listener)); 
      TopButtons.add(new Button("Black", listener)); 


      // Buttons that will appear on the bottom of the pannel 
      ArrayList<Button> BotButtons = new ArrayList<Button>(); 
      BotButtons.add(new Button("Small", listener)); 
      BotButtons.add(new Button("Medium", listener)); 
      BotButtons.add(new Button("Large", listener)); 
      BotButtons.add(new Button("Clear", listener)); 


      // Using for loops to clean up code a bit. 
      for (int i = 0; i < TopButtons.size(); i++){ 
       this.add(TopButtons.get(i)); 
      } 

      // add the overlay rather than the drawboard, to ensure that mouse functions work 
      this.add(overlay); 

      for (int i = 0; i < BotButtons.size(); i++){ 
       this.add(BotButtons.get(i)); 
      } 
     } 
    } 

버튼.자바

import java.awt.Dimension; 
import javax.swing.JButton; 

public class Button extends JButton{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -819700115106662958L; 

    private final Listener listener; 
    public Button(String name, Listener listener) { 
     this.listener = listener; 
     this.setText(name); 
     this.setName((String) name); 
     buttonSettings(); 
    } 

    private void buttonSettings(){ 
     this.addActionListener(listener); 
     int width = 150; 
     int height = 50; 
     Dimension dim = new Dimension(width,height); 
     this.setPreferredSize(dim); 
    } 

} 

DrawBoard.java :

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.util.ArrayList; 
import javax.swing.JPanel; 

public class DrawBoard extends JPanel{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1368365222404381200L; 


    // ArrayList will store all points drawn on the canvas 
    public ArrayList<Point> points = new ArrayList<Point>(); 

    // Constructor initiates the settings for the board 
    public DrawBoard(){ 
     DrawBoardSettings(); 

    } 

    // Painting of the points happens here 
    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     // draws a point for every point in the "points" array. 
     for (int i = 0; i < points.size(); i++){ 
      Point thisPoint = points.get(i); 
      g.setColor(thisPoint.color); 
      g.fillOval(thisPoint.x,thisPoint.y,thisPoint.size,thisPoint.size); 
     } 

    } 

    private void DrawBoardSettings(){ 
     // Sets the preferred window size 
     int width = 700; 
     int height = 600; 
     Dimension dim = new Dimension(width,height); 
     this.setPreferredSize(dim); 

     // background color and visibility 
     this.setBackground(Color.WHITE); 
     this.setVisible(true); 
     this.setOpaque(true); 
    } 
} 

Listener.java :

import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JComponent; 

public class Listener implements ActionListener, MouseListener, MouseMotionListener { 

    private final DrawBoard drawBoard; 

    //sets default color and size 
    private Color color; 
    private int size; 




    public Listener(DrawBoard drawBoard) { 
     this.drawBoard = drawBoard; 

     this.color = Color.BLACK; 
     this.size = 10; 
    } 


    // Contains settings for creating a new point 
    private void drawPoint(MouseEvent e){ 
     Point point = new Point(e.getX(), e.getY(), this.color, this.size); 
     drawBoard.points.add(point); 
     drawBoard.repaint(); 
    } 


    // Contains settings for all of the buttons 
    private void setButton(String name){ 
     // Colors 
     if (name == "Blue"){ 
      this.color = Color.BLUE; 
     } 
     if (name == "Red"){ 
      this.color = Color.RED; 
     } 
     if (name == "Green"){ 
      this.color = Color.GREEN; 
     } 
     if (name == "Black"){ 
      this.color = Color.BLACK; 
     } 

     // Sizes 
     if (name == "Large"){ 
      this.size = 15; 
     } 
     if (name == "Medium"){ 
      this.size = 10; 
     } 
     if (name == "Small"){ 
      this.size = 5; 
     } 


     // Clear 
     if (name == "Clear"){ 
      drawBoard.points.clear(); 
      drawBoard.repaint(); 
     } 

    } 




    // Draws a point when the mouse is pressed down 
    @Override 
    public void mousePressed(MouseEvent e) { 
     drawPoint(e); 

    } 

    // Draws a point when the mouse is dragged (at every location it is dragged at) 
    @Override 
    public void mouseDragged(MouseEvent e) { 
     drawPoint(e); 
    } 

    // Changes the settings of buttons 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     String name = ((JComponent) e.getSource()).getName(); 
     setButton(name); 


    } 



    //Unused Listeners 
    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 
    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

} 

Point.java

import java.awt.Color; 

public class Point { 

    protected int x, y, size; 
    protected Color color; 

    public Point(int x, int y, Color color, int size){ 

     this.x = x; 
     this.y = y; 
     this.color = color; 
     this.size = size; 
    } 

} 
관련 문제