2016-12-09 4 views
0

Ich habe meine Java-Hausaufgaben abgeschlossen, aber es wurde alles in eine Hauptklasse (mit ein paar privaten Klassen). Ich versuche, meinen Code eleganter zu machen, indem ich getrennte Klassen habe, um die Dinge zu handhaben. Ich habe Probleme, den Zuhörer mit den vorhandenen Panels interagieren zu lassen.Verwenden einer Zuhörerklasse für alle hörenden

Die wichtigsten Teile, die ich betrachte, sind in der Listener.java. Der Mausklick und Aktionslistener. Ich kann den Namen der Schaltfläche abrufen, die angeklickt wurde, um den Listener auszulösen, was hilfreich ist, aber ich kann nicht mit dem Panel "DrawBoard" interagieren, das zum Panel-Panel hinzugefügt wurde.

Ich frage mich, was der beste Weg, um diese Interaktion zu arbeiten:

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. java

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** 
    } 

} 

Antwort

0

Einige Gedanken hier:

  • Derzeit haben Sie mehrere Instanzen dieser Listener-Klasse. Das ist wahrscheinlich nicht das, was du willst.
  • In Verbindung damit: Ihr Code zeigt an, dass Ihre Listener-Klasse auf einem Panel zeichnen sollte. Wenn ja ... dass der Listener irgendwie Zugang zu diesem Panel benötigt.

Ein Weg, um dorthin zu gelangen: Sie Konstruktor ändern

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

und dann actionPerformed() Methode etwas zu ziehen hat.

Der Kern zu verstehen: Sie müssen ein klares Modell (in Ihrem Kopf) über welche Komponenten Sie haben; und wie sie voneinander abhängen. Weil das Ihre Implementierung antreibt; zum Beispiel bezüglich der Reihenfolge, in der Sie Ihre verschiedenen Objekte erstellen müssen. Bei meinem Beispiel müssten Sie zuerst ein Panel-Objekt erstellen; so dass Sie dann einen Listener für dieses Panel erstellen können.

+0

Danke. Ich musste nur sicherstellen, dass ich die Klasse nur einmal initiierte und dann andere Klassen diese erste Instanz davon nannte. –

0

Hier ist der Code für mein abgeschlossenes Projekt. Ich glaube, ich habe es viel sauberer und nur einmal als "Zuhörer" und "drawBoard", die meine Probleme geklärt:

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)); 
      } 
     } 
    } 

Schaltfläche.java

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; 
    } 

} 
Verwandte Themen