Как получить доступ к публичному методу внешнего класса, чтобы перекрасить на JPanel? - PullRequest
2 голосов
/ 23 ноября 2011

Я не могу получить доступ к общедоступному методу моего класса MyPanel, который расширяет JPanelMyPanel ранее у меня был private метод, называемый moveSquare, но чтобы заставить его работать для внешних запросов, я изменил его на public, но он все еще не работает?Как заставить это работать?

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseMotionAdapter;

public class mull {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel p = createAndShowGUI();
                iterate(p);
                // "The method iterate(MyPanel) in the type mull is not applicable for the arguments (JPanel)"
            }
        });
    }

    private static JPanel createAndShowGUI() {
        System.out.println("Created GUI on EDT? "+
        SwingUtilities.isEventDispatchThread());
        JFrame f = new JFrame("Swing Paint Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        // how to grab link to this panel - in order to use it in iteration loop ?
        MyPanel p = new MyPanel();
        f.add(p);
//        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
        return p;
    } 
    private static void iterate(JPanel p){
        // the loop should change square position on each iteration
        // how to implement ?

        for (int i  = 0; i < 999; i++){
            ((MyPanel) p).moveSquare(100 + i*10, 200 + i*10); // here is problem: 
            //"Cannot make a static reference to the non-static method moveSquare(int, int) from the type MyPanel"
        }


    }
}

class MyPanel extends JPanel {

    private int squareX = 50;
    private int squareY = 50;
    private int squareW = 200;
    private int squareH = 200;

    public MyPanel() {

        setBorder(BorderFactory.createLineBorder(Color.black));

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                moveSquare(e.getX(),e.getY());
            }
        });

        addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                moveSquare(e.getX(),e.getY());
            }
        });

    }
    // originally this method was private - in orger to access it within mull, it vas changed to public
    public void moveSquare(int x, int y) {
        int OFFSET = 1;
        if ((squareX!=x) || (squareY!=y)) {
            repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
            squareX=x;
            squareY=y;
            repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
        } 
    }


    public Dimension getPreferredSize() {
        return new Dimension(900,700);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);       
        g.drawString("This is my custom Panel!",10,20);
        g.setColor(Color.RED);
        g.fillRect(squareX,squareY,squareW,squareH);
        g.setColor(Color.BLACK);
        g.drawRect(squareX,squareY,squareW,squareH);
    }  
}

Что делает этот синтаксис ((MyPanel) p).moveSquare(100 + i*10, 200 + i*10);?Как рисовать нестандартные фигуры (овалы) в iterate(p)?

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

У вас должна быть ссылка на MyPanel. В классе Малл добавьте это вверху:

MyPanel myPanel = null;

Затем, когда вы добавляете панель, сделайте это так:

myPanel = new MyPanel();
f.add(myPanel);

Теперь вы можете ссылаться на myPanel из своего класса. Также классы должны всегда начинаться с заглавной буквы в Java (только потому, что), поэтому измените их на Mull.

2 голосов
/ 23 ноября 2011

Не похоже, что вы даже звоните iterate().

Но в любом случае ваш moveSquare метод не является статичным и, следовательно, ожидает, что конкретный экземпляр MyPanel будет работать,Так что вы, вероятно, захотите сохранить ссылку на свою панель.Скажем, вместо f.add(new MyPanel()) вы можете использовать:

MyPanel p = new MyPanel();
f.add(p);

, а затем передать p в iterate и вызвать p.moveSquare(100,200) там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...