Проблема Java Swing Threading - PullRequest
       8

Проблема Java Swing Threading

1 голос
/ 28 апреля 2011

У меня проблема с использованием потоков в свинге.Сначала я объясню проблему, а затем опубликую свой код.

Проблема заключается в следующем.У меня есть два класса, один из которых содержит бизнес-логику, а другой содержит пользовательский интерфейс.Основываясь на действиях пользователя в интерфейсе, я вызываю методы в классе, который содержит бизнес-логику.Тем не менее, моя следующая задача состоит в том, чтобы пользователь щелкнул элемент пользовательского интерфейса, и на основе этого щелчка я присоединяю новый слушатель мыши к другому элементу пользовательского интерфейса и жду, когда пользователь щелкнет этот другой элемент пользовательского интерфейса, после чего я быкак изменить элемент пользовательского интерфейса, по которому щелкнулиТем не менее, мое приложение блокируется после нажатия на другой элемент пользовательского интерфейса.В примере кода и начальный элемент пользовательского интерфейса, и другой элемент пользовательского интерфейса одинаковы, но в целом они не будут.

Примеры классов:

====================================================================

package threadtests;

import java.awt.Color;

public class LogicClass extends Thread {

    FrameClass fc;
    SelectSynchronizerObject mysso;

    public void run() {
        while(true);
    }

    public void startThisFromFrame() {
        MyMouseListener2 m2 = new MyMouseListener2();
        m2.initialize(fc.jp, mysso);
        fc.jp.addMouseListener(m2);
        mysso.getSelected();
        fc.jp.setBackground(new Color(100,100,100));
        fc.jp.removeMouseListener(m2);
    }

    public static void main(String args[]) {
        SelectSynchronizerObject sso = new SelectSynchronizerObject();
        LogicClass lc = new LogicClass();
        lc.mysso = sso;
        lc.start();
        FrameClass fc = new FrameClass();
        fc.lc = lc;
        lc.fc = fc;
        fc.mysso = sso;
        fc.initialize(lc);
    }

}

==========================================================================

package threadtests;

import java.awt.Color;

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

public class FrameClass extends JFrame {

    LogicClass lc;
    SelectSynchronizerObject mysso;
    JPanel jp = new JPanel();

    public void initialize(LogicClass arg) {
        lc = arg;
        setSize(100,100);
        MyMouseListener m = new MyMouseListener(); 
        jp.addMouseListener(m);
        m.initialize(jp, lc);
        jp.setBackground(new Color(255,200,200));
        add(jp);

        setVisible(true);
    }

}

====================================================================

package threadtests;

public class SelectSynchronizerObject {

    public int selectednumer = 0;
    public boolean numberset = false;

    public synchronized void panelSelected(int a) {
        selectednumer = a;
        notify();
    }

    public synchronized int getSelected() {
        try {
            wait();
        } catch (InterruptedException e) {
            System.out.println(e);
        }
        return selectednumer;
    }

}

==========================================================================

package threadtests;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

public class MyMouseListener implements MouseListener  {

    JPanel mypanel;
    LogicClass lc;
    public void initialize(JPanel arg, LogicClass arg2) {
        mypanel = arg;
        lc = arg2;
    }
    public void mouseClicked(MouseEvent e) {
        lc.startThisFromFrame();
    }
    public void mousePressed(MouseEvent e) {

    }
    public void mouseReleased(MouseEvent e) {
    }
    public void mouseEntered(MouseEvent e) {
        mypanel.setBackground(new Color(200,255,200));
    }
    public void mouseExited(MouseEvent e) {
        mypanel.setBackground(new Color(255,200,200));
    }

}

====================================================================

package threadtests;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

public class MyMouseListener2 implements MouseListener  {

    JPanel mypanel;
    SelectSynchronizerObject sso;
    public void initialize(JPanel arg, SelectSynchronizerObject arg1) {
        mypanel = arg;
        sso = arg1;
    }
    public void mouseClicked(MouseEvent e) {
        sso.panelSelected(1);
    }
    public void mousePressed(MouseEvent e) {
    }
    public void mouseReleased(MouseEvent e) {
    }
    public void mouseEntered(MouseEvent e) {
    }
    public void mouseExited(MouseEvent e) {
    }

}

==========================

Спасибо за помощь.

1 Ответ

2 голосов
/ 28 апреля 2011

Первый:

public void run() {
    while(true);
}

просто отнимает у ЦП возможность делать другие вещи даром.

Тогда:

wait();

вызывается в главном потоке и таким образом блокируется.

На самом деле вам не нужны invokelater, SwingWorker или что-то еще, у вас есть только небольшое программирование событий GUI. Сначала подключите слушателей событий, затем вы получите выбранную панель без каких-либо потоков.

Как правило, хотя потоки необходимы для довольно большого количества программ, вам не нужно заставлять их там, где они не нужны, поскольку они значительно усложняют программирование.

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