Avatar billede fredand Forsker
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());   
        }
       
    }

}
Avatar billede tjens Nybegynder
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 );
        }
     
    }
Avatar billede fredand Forsker
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());
                }
        }
       
    }

}
Avatar billede tjens Nybegynder
20. december 2008 - 14:06 #3
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester