Как можно поместить результаты 5 потоков в текст метки? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть следующий код для создания GridLayout. Есть 5 ярлыков. Мне нужно сделать 5 потоков CoinFlip и установить текст меток в качестве результатов.

Я понятия не имею, с чего начать, извините, что не уточнил. Заранее спасибо!

public class GrLayout {

JFrame frame = new JFrame("Coin Flip Results");
JPanel panel = new JPanel();
JLabel lbl1 = new JLabel("1");  
JLabel lbl2 = new JLabel("2");
JLabel lbl3 = new JLabel("3");
JLabel lbl4 = new JLabel("4");
JLabel lbl5 = new JLabel("5");

public GrLayout() {
    panel.setLayout(new GridLayout(1,5));
    panel.add(lbl1);
    panel.add(lbl2);
    panel.add(lbl3);
    panel.add(lbl4);
    panel.add(lbl5);
    frame.add(panel);

    frame.setSize(500, 100);

    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);
}

public static void main(String[] args) {    

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            new GrLayout();             
        }           
    });

}

}

1 Ответ

0 голосов
/ 07 октября 2019

Это просто простой пример того, как вы МОЖЕТЕ реализовать это:

  • код, который необходимо запустить в отдельном потоке, должен быть инкапсулирован в класс, реализующий интерфейс java.lang.Runnable,внутри это public void run() метод. Таким образом, в вашем случае, это была «сложная» логика переворота - сложные, сложные вычислительные вещи никогда не должны происходить на Swings, так называемом Event Dispatch Thread (EDT), потому что это может заморозить ваш GUI и не будет выглядеть гладко; -)

  • следующая важная часть: вызовите связанные с пользовательским интерфейсом операции в потоке диспетчеризации событий ... этого можно достичь, вызвав SwingUtilities.invokeLater()

Для простоты и краткостив этом примере я создал подкласс javax.swing.JLabel и позволил ему реализовать интерфейс java.lang.Runnable. В классе CoinFlipApp я получил экземпляр ExecutorService - думайте о нем как о пуле потоков. Чтобы выполнить вещи в отдельных потоках с помощью этого пула потоков, вы должны передать ему Runnable, который затем будет запланирован для выполнения. Это происходит по телефону executorService.submit(coinFlip);

import javax.swing.SwingUtilities;

public class CoinFlipApp extends JFrame {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame();
            LayoutManager layoutManager = new BoxLayout(f.getContentPane(), BoxLayout.LINE_AXIS);
            f.getContentPane().setLayout(layoutManager);
            f.setDefaultCloseOperation(EXIT_ON_CLOSE);
            f.setVisible(true);
            for (int i=0, j=5; i<j; i++) {
                CoinFlip coinFlip = new CoinFlip();
                f.getContentPane().add(coinFlip);
                executorService.submit(coinFlip);
            }
        });
    }
}



import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class CoinFlip extends JLabel implements Runnable {

    @Override
    public void run() {
        final String value = Boolean.toString(randomBoolean()).toUpperCase();
        SwingUtilities.invokeLater(() -> {
            CoinFlip.this.setText(value);
            CoinFlip.this.repaint();
        });
    }

    private boolean randomBoolean() {
        try {
            // this can be removed later
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return Math.random() < 0.5;
    }
}
...