19. december 2008 - 16:21
Der er
2 kommentarer og 1 løsning
Why does not my repaint work?
Hello! I got a problem with a repaint between two windows. If you try the code below you will see that the main slider manage to update the textfield and the panel. But the slider in the dialog justa manage to update the textfield. I would love to get some input about this problem. Best regards Fredrik package test; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.border.BevelBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class SliderTest extends JFrame implements ActionListener { JPanel panel = new JPanel(); JSlider slider1 = null; JTextField textField1 = null; JSlider slider2 = null; JButton openDialog = null; JDialog dialog = null; Apanel aPanel = null; public SliderTest() { textField1 = new JTextField("0"); slider1 = getSlider(textField1, this); aPanel = new Apanel(slider1); aPanel.setSize(100, 100); openDialog = new JButton("Open dialog"); panel.add(slider1); panel.add(textField1); panel.add(openDialog); panel.add(aPanel); JOptionPane optionPane = new JOptionPane(); slider2 = getSlider(textField1, this); optionPane.setMessage(new Object[] { slider2}); dialog = optionPane.createDialog(this, "Lets see if this slider can update other window!"); openDialog.addActionListener(this); add(panel); pack(); setVisible(true); } public void repaint() { aPanel.repaint(); } public JSlider getSlider(final JTextField tf, final SliderTest sliderTest) { JSlider slider = new JSlider(JSlider.VERTICAL, 0, 10, 0); slider.setMajorTickSpacing(10); slider.setPaintTicks(true); slider.setPaintLabels(true); ChangeListener changeListener = new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { JSlider theSlider = (JSlider) changeEvent.getSource(); tf.setText("" + theSlider.getValue() ); sliderTest.repaint(); } }; slider.addChangeListener(changeListener); return slider; } public void actionPerformed(ActionEvent e) { dialog.setVisible(true); } public static void main(String[] args) { new SliderTest(); } class Apanel extends JPanel { JSlider slider = null; Apanel(JSlider s) { slider = s; setSize(100, 100); setPreferredSize(new Dimension(100, 100)); setBorder(new BevelBorder( BevelBorder.LOWERED ) ); setBackground(Color.red); } public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillRect(0, 0, 100, 100); g.setColor(Color.black); g.drawOval(10, 10, slider.getValue(), slider.getValue()); } } }
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
19. december 2008 - 21:57
#1
slider2 is not connected to aPanel like slider1 is. Repaint works well but drawOval reads the slider1 values. Thereby there are no visual changes during the repaint. See yourself by adding a repaint counter: class Apanel extends JPanel { JSlider slider = null; int count = 0; Apanel(JSlider s) { slider = s; setSize(100, 100); setPreferredSize(new Dimension(100, 100)); setBorder(new BevelBorder( BevelBorder.LOWERED ) ); setBackground(Color.red); } public void paintComponent(Graphics g) { this.count++; g.setColor(Color.red); g.fillRect(0, 0, 100, 100); g.setColor(Color.black); g.drawOval(10, 10, slider.getValue(), slider.getValue()); g.drawString( Integer.toString(count), 40, 40 ); } }
20. december 2008 - 11:58
#2
Hello! Thanks alot! I did not saw that misstake, and I acctually did it twice, in my real app (to big to post here) and in this example app. Thanks alot! You really should post a "svar" so I can reward you mate! Best regards Fredrik Below my new example app: package test; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.border.BevelBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class SliderTest extends JFrame implements ActionListener { JPanel panel = new JPanel(); JSlider slider1 = null; JTextField textField1 = null; JSlider slider2 = null; JButton openDialog = null; JDialog dialog = null; Apanel aPanel = null; public SliderTest() { textField1 = new JTextField("0"); slider1 = getSlider(textField1, this); aPanel = new Apanel(); aPanel.setSize(100, 100); openDialog = new JButton("Open dialog"); panel.add(slider1); panel.add(textField1); panel.add(openDialog); panel.add(aPanel); JOptionPane optionPane = new JOptionPane(); slider2 = getSlider(textField1, this); optionPane.setMessage(new Object[] { slider2}); dialog = optionPane.createDialog(this, "Lets see if this slider can update other window!"); openDialog.addActionListener(this); add(panel); pack(); setVisible(true); } public void repaint(JSlider slider) { aPanel.setSlider(slider); aPanel.repaint(); } public JSlider getSlider(final JTextField tf, final SliderTest sliderTest) { final JSlider slider = new JSlider(JSlider.VERTICAL, 0, 10, 0); slider.setMajorTickSpacing(10); slider.setPaintTicks(true); slider.setPaintLabels(true); ChangeListener changeListener = new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { JSlider theSlider = (JSlider) changeEvent.getSource(); tf.setText("" + theSlider.getValue() ); sliderTest.repaint(slider); } }; slider.addChangeListener(changeListener); return slider; } public void actionPerformed(ActionEvent e) { dialog.setVisible(true); } public static void main(String[] args) { new SliderTest(); } class Apanel extends JPanel { JSlider slider = null; Apanel() { setSize(100, 100); setPreferredSize(new Dimension(100, 100)); setBorder(new BevelBorder( BevelBorder.LOWERED ) ); setBackground(Color.red); } public void setSlider(JSlider s) { slider = s; } public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillRect(0, 0, 100, 100); g.setColor(Color.black); if(slider != null) { g.drawOval(10, 10, slider.getValue(), slider.getValue()); } } } }
20. december 2008 - 14:06
#3
Svar
Kurser inden for grundlæggende programmering