Обновить элементы GUI в java
Я новичок в GUIs на java.
например, мне нужно обновить только 1 элемент (например, JLabel
). В Tkinter я бы использовал что-то вроде root.update()
или root.update_idletasks()
. Интересно, существует ли аналогичная простая функция для приложений, сделанных с помощью swing. Я пытался gui_element.SetVisible(false)
и gui_element.SetVisible(true)
и подобные вещи, но не очень успешно. Я подозреваю что-то с javax.swing.Timer
должно работать, но не знаю как.
редактировать вот код. Пожалуйста, дайте мне знать, если найдете другая ошибка. Спасибо
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class sof_sample{
/**
* @param args
*/
private static JFrame frame1 = new JFrame("Fractal Geometry");
public static JButton quit_button = new JButton("Quit");
private static JButton run_button = new JButton("Run");
private static JLabel label1 = new JLabel();
public static JLabel label_iter = new JLabel();
private static GridLayout layout1 = new GridLayout(2,20);
private JOptionPane msg1 = new JOptionPane();
private static int counter;
public static void main(String[] args) {
// TODO Auto-generated method stub
AuxClass1 inst1 = new AuxClass1();
quit_button.addActionListener(inst1);
run_button.addActionListener(inst1);
label1.setText("Iteration");
label1.setVerticalTextPosition(JLabel.CENTER);
label1.setHorizontalAlignment(JLabel.CENTER);
label_iter.setText("0");
label_iter.setBorder(BorderFactory.createLineBorder(Color.BLACK));
label_iter.setVerticalTextPosition(JLabel.CENTER);
label_iter.setHorizontalAlignment(JLabel.CENTER);
//add widgets to the frame
frame1.add(label1);
frame1.add(label_iter);
frame1.add(run_button);
frame1.add(quit_button);
frame1.setLayout(layout1);
frame1.setLocationRelativeTo(null);
//frame1.pack();
frame1.setSize(250, 75);
frame1.setVisible(true);
}
}
class AuxClass1 implements ActionListener{
sof_sample inst2 = new sof_sample();
public void actionPerformed(ActionEvent event1){
if (event1.getSource()==inst2.quit_button){
System.exit(0);
}
else{
for (int i=0;i<20000;i++){
inst2.label_iter.setText(Integer.toString(i));
}
//msg1.showMessageDialog(frame1, "Not yet!");
}
}
}
2 ответов
Swing управляется событием. Все компоненты работают через шаблон MVC. Вам не нужно явно перекрашивать его, скрывая / показывая, чтобы обновить его представление на экране.
просто ты yourLabel.setText("your new text")
и новый текст появится на этикетке.
имейте в виду, что большинство GUI-обновлений (setText
является исключением) необходимо выполнить на EDT, поэтому используйте SwingUtilities.invokeLater
etc если вы обновление вызвано, скажем, сетевым сообщением.
если у вас структурные изменения в GUI вам придется revalidate()
/repaint()
хотя.
С помощью Javax.качать.Таймер вы можете достичь своей цели.
timer = new Timer(100,new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText(String.valueOf(i));
if(i==100){
timer.stop();
}
i++;
}
});
когда вы хотите изменить значения на JLabel, в этот момент просто запустите таймер с помощью timer.start()
, поэтому значения на метке будут изменены до 100. когда i
значение достигает 100,timer.stop()
остановит таймер.
вот javax.качать.таймер учебник. Взгляните на этот. http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/Timer.html
загрузите рабочий пример из ссылки ниже...
https://docs.google.com/open?id=0B9U-BwYu62ZaQWZMWloxdHp0YWs
Я думаю, что это работает для вас..