I’m new to GUIs in java.
For example, I need to update just 1 element (e.g., JLabel
). In Tkinter I would use something like root.update()
or root.update_idletasks()
. I wonder if a similar simple function exists in for applications made with swing. I’ve tried gui_element.SetVisible(false)
and gui_element.SetVisible(true)
and similar stuff, but not very successfully. I suspect something with javax.swing.Timer
should work, but do not know how.
EDIT Here is the code. Please let me know if you find other errors. Thanks
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!"); } } }
Advertisement
Answer
Swing is event driven. All components work through the MVC pattern. You don’t need to explicitly repaint it by hiding/showing in order to update it’s representation on the screen.
You just do yourLabel.setText("your new text")
and the new text will appear on the label.
Keep in mind that most GUI-updates (the setText
is an exception) needs to be performed on the EDT, so use SwingUtilities.invokeLater
etc if you’re update is triggered by, say, a network message.
If you do structural changes to the GUI you’ll have to revalidate()
/repaint()
though.