2017-01-30 6 views
-1

У меня есть JFrame. в JFrame - JDesktopPane, JComboBox, несколько JLabel s и a JProgressBar. Я столкнулся с двумя проблемами:jLabel не меняет текст и jProgressbar не обновляется

  1. Я хочу, чтобы обновить/изменить текст в одном из JLabel с в JFrame, нажав JButton, который находится на JInternalFrame (кнопка делает некоторые вычисления).

  2. После нажатия на JButton, который находится на другом JInternalFrame (кнопка выполняет небольшое задание), я хочу использовать JProgressBar (ProgressBar в JFrame), чтобы показать ход проделанной работы.

Я использую SwingUtilities.invokelater() для выполнения задач, выполняемых кнопками. Я использую NetBeans как свою IDE.

+0

Не могли бы вы поделиться тем, что вы уже пробовали (код)? –

+1

Добро пожаловать в «Переполнение стека», пожалуйста, возьмите [tour] и пройдите [помощь] и узнайте [ask], затем опубликуйте действительный [mcve] или [Short, Self Contained, Correct Example] (http: // sscce .org /). Если ваша проблема связана с тем, что вы хотите изменить текст с помощью кнопки JLabel на кнопке, тогда создайте простое окно с помощью 'JLabel' и' JButton' и его 'actionPerformed'' myLabel.setText ("Whatever текст, который вы хотите ");'. Также, пожалуйста, напишите некоторые заглавные слова, когда это необходимо, трудно прочитать все в нижнем регистре. – Frakcool

+0

[Возможный дубликат] (http://stackoverflow.com/questions/12020949/jprogressbar-isnt-progressing/12021971#12021971) – MadProgrammer

ответ

1

Трудно узнать, что происходит без кода, но, вероятно, поток отправки событий (EDT) блокируется (или завершается?), Например. по коду вызывается invokeLater. EDT используется для обновления GUI и не должен использоваться для (медленных) вычислений, не связанных с GUI. См. Учебник «Диспетчер событий» и последующие подробности.

Пример (без блокировки):

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.time.LocalTime; 

import javax.swing.*; 

public class LabelProgress { 

    public static void main(String[] args) { 
     LabelProgress main = new LabelProgress(); 
     SwingUtilities.invokeLater(() -> main.showInternal1()); 
     SwingUtilities.invokeLater(() -> main.showInternal2()); 
    } 

    private JFrame frame; 
    private JLabel label; 
    private JDesktopPane desktop; 
    private JProgressBar bar; 

    private int progress = 0; 

    private LabelProgress() { 
     label = new JLabel("Label: "); 

     desktop = new JDesktopPane(); 

     bar = new JProgressBar(0, 100); 
     bar.setStringPainted(true); 

     frame = new JFrame(); 
     frame.setLayout(new BorderLayout()); 
     frame.add(label, BorderLayout.BEFORE_FIRST_LINE); 
     frame.add(desktop, BorderLayout.CENTER); 
     frame.add(bar, BorderLayout.AFTER_LAST_LINE); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setSize(600, 400); 
     frame.validate(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private void showInternal1() { 
     JButton change = new JButton("Change"); 
     change.addActionListener(this::doChange); 

     JInternalFrame internal = new JInternalFrame("Change Label"); 
     internal.setLayout(new FlowLayout()); 
     internal.add(change); 
     internal.setBounds(20, 20, 200, 150); 
     internal.setVisible(true); 
     desktop.add(internal); 
    } 

    private void showInternal2() { 
     JButton task = new JButton("Task"); 
     task.addActionListener(this::doTask); 

     JInternalFrame internal = new JInternalFrame("Small Task"); 
     internal.setLayout(new FlowLayout()); 
     internal.add(task); 
     internal.setBounds(150, 100, 200, 150); 
     internal.setVisible(true); 
     desktop.add(internal); 
    } 

    private void doChange(ActionEvent ev) { 
     // using a SwingWorker: 
     // for demonstration I used an anonymous class, maybe a own class is better 
     SwingWorker<LocalTime , Void> worker = new SwingWorker<LocalTime , Void>() { 
      @Override 
      protected LocalTime doInBackground() throws Exception { 
       // not executed on the EDT - just get the current time 
       LocalTime someCalculation = LocalTime.now(); 
       return someCalculation; 
      } 
      @Override 
      protected void done() { 
       // executed on EDT 
       try { 
        LocalTime resultOfSomeCalculation = get(); 
        label.setText("Label: " + resultOfSomeCalculation.toString()); 

       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }; 
     worker.execute(); 
    } 

    private void doTask(ActionEvent ev) { 
     // no need to use SwingWorker 
     Thread thread = new Thread(this::slowTask); 
     thread.start(); 
    } 

    private void slowTask() { 
     // not really that slow, just for demonstration 
     progress += 10; 
     if (progress > 100) progress = 100; 

     // and now switching to the EDT 
     SwingUtilities.invokeLater(() -> bar.setValue(progress)); 
    } 
}