Отвечать на события в других JPanels - PullRequest
2 голосов
/ 17 января 2010

Хорошо, допустим, у меня есть 3 Jpanels - 1 родитель и 2 детей

//Assume necessary imports etc

родитель это что-то вроде:

public class ParentPanel extends JFrame  {
private JPanel mainPanel,controlPanel;

public ParentPanel(){
    MainPanel pp= new ParentPanel();
    controlPanel cp = new controlPanel();
}
...

Основная панель в реальной жизни похожа на 2D-графику, но не важна для упрощенного пункта:

public class MainPanel implements MouseMotionListener{
    public MainPanel(){
        //not important now 
    }

    public void MouseMoved(MouseEvent arg0){
        int xPos e.getX
    }
...

То, что я хочу сделать, это получить X-положение мыши и передать его от главной панели к родительскому элементу и в метку, например, на контрольной панели брата.

Любые идеи, подсказки или указатели оценены, спасибо

Ответы [ 3 ]

0 голосов
/ 17 января 2010

Вы можете создать интерфейс, который будет уведомлять об изменениях, которые ParentPanel может затем реализовать, и MainPanel может использовать для передачи сообщения.

interface XPositionListener {
    void updateXPosition(int xPos);
}  

public class ParentPanel extends JFrame implements XPositionListener  {
    private MainPanel mainPanel; private ControlPanel controlPanel;

    public ParentPanel() {
        mainPanel = new MainPanel(this);
        controlPanel = new ControlPanel();
    }

    void updateXPosition(int xPos) {
        // Update a label or whatever
    }   

    // ...
}

public class MainPanel implements MouseMotionListener {
    XPositionListener listener;

    public MainPanel(XPositionListener listener) {
         this.listener = listener;
    }

    public void MouseMoved(MouseEvent event) {
        int xPos = event.getPoint().x;
        listener.updateXPosition(xPos);
    }

    // ...
}

Ознакомьтесь с шаблоном Observer для получения информации о более надежном решении.

0 голосов
/ 17 января 2010

В зависимости от того, насколько сложен графический интерфейс, вы можете передать объект ParentPanel в качестве параметра объекту MainPanel.В MainPanel вы имеете доступ ко всем компонентам ParentPanel и т. Д.

 public class MainPanel implements MouseMotionListener{

 ParentPanel parent;

 public MainPanel(ParentPanel p){
    //not important now
    parent = p; 
 }

 public void MouseMoved(MouseEvent arg0){
    //Access to parent here.
 }

И в ParentPanel при создании MainPanel:

MainPanel pp= new MainPanel(this);

Это, конечно, очень простое решениеболее сложные графические интерфейсы не подойдут.

0 голосов
/ 17 января 2010

Вы можете написать сквозного слушателя. Что-то в дочерней панели, что родитель тоже может слушать. Затем, когда ребенок получил событие перемещения мыши, он отправил его обратно родителю.

Вы также можете сделать метку на контрольной панели брата маленьким модельным объектом. Тогда оба слушателя узнают о модельном объекте. Один ребенок будет изменять его, а другой будет слушать обновления.

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