problem z odświeżaniem pasków JScrollPane przy zmianie wielkości komponentu

0

Witam,
mam problem z odświeżaniem pasków przewijania w JScrollPane, gdy zmienia się rozmiar komponentu.
Pomóźcie proszę:)

wrzucam kod by zilustrować dokładnie problem, mamy kwadrat i dwa przyciski, które zmnieniają rozmiar kwadratu. Jak zwiększamy przyciskiem, paski przewijania się nie pojawiają. Pojawią się jednak gdy tylko zmienimy rozmiar ramki myszką.

Jak należy odświeżać te paski?

 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;

public class test{
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                JFrame ramka=new Ramka();
                ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                ramka.setVisible(true);
            }
        });
    }
}
class Ramka extends JFrame{
    public Ramka(){
       setSize(300,300);
        

        JScrollPane scrollKwadrat=new JScrollPane(kwadrat);
        add(scrollKwadrat);
        
        JButton powieksz=new JButton("Powiększ");
        JButton zmniejsz=new JButton("zmniejsz");
        
        add(powieksz, BorderLayout.NORTH);
        add(zmniejsz, BorderLayout.SOUTH);
        
        powieksz.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        kwadrat.powieksz();
        }});

        zmniejsz.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        kwadrat.zmniejsz();
        }});        
    }
       Kradrat kwadrat=new Kradrat();    
}

class Kradrat extends JComponent{
    public Kradrat(){
        
        
    }
    public void paintComponent(Graphics g){
        
        super.paintComponent(g);
        
        this.setPreferredSize(new Dimension(a, a));
        
        Graphics2D g2=(Graphics2D)g;
        g2.setColor(Color.red);
        g2.fillRect(0,0,a,a);
    }
    public void powieksz(){
        a+=20;
        repaint();
    }
        public void zmniejsz(){
        a-=20;
        repaint();
    }
    
    private int a=200;
}

pozdrawiam,
Tomek

0

Nie wiem co chcesz uzyskać. Mam trzy hipotezy:

  • paski są widoczne od razu,
  • paski się pojawiają gdy kwadrat nie będzie się mieścił w oknie, rozmiar okna się nie zmienia
  • okno rośnie wraz z kwadratem, paski pojawiają się wtedy gdy okno nie może już rosnąc bo się skończył ekran.
    Rozwiązanie dla drugiego przypadku (tylko zwiększanie);
class Ramka extends JFrame{
    public Ramka(){
        setSize(300,300);

        add(scrollKwadrat);

        JButton powieksz=new JButton("Powiększ");
        JButton zmniejsz=new JButton("zmniejsz");

        add(powieksz, BorderLayout.NORTH);
        add(zmniejsz, BorderLayout.SOUTH);

        powieksz.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        kwadrat.powieksz();
                        remove(scrollKwadrat);
                        scrollKwadrat=new JScrollPane(kwadrat);
                        add(scrollKwadrat);
                        validate();
        }});

        zmniejsz.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        kwadrat.zmniejsz();
        }});
    }
       Kradrat kwadrat=new Kradrat();
       JScrollPane scrollKwadrat=new JScrollPane(kwadrat);
}
0

Dodaj revalidate() do metody powieksz().

 public void powieksz(){
        a+=20;
        repaint();
	revalidate();
    }

ale jaja! validate() nie działa;)

0

Zgoda, ponieważ suwaki są w klasie ramka, to chciałem je uzyskać modyfikując tylko klasę Ramka. Można to zrobić prościej:

        powieksz.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        kwadrat.powieksz();
                        kwadrat.revalidate();
        }});
0

Ja też takie coś próbowałem ale ponieważ jestem głupszy od ciebie to próbowałem wywołać metodę revalidate na rzecz obiektu scrollKwadrat ale nie mogłem dostać się do referencji tego obiektu (poprzez: scrollKwadrat'dot') i dałem sobie spokój ale znalazłem sposób podany wyżej przeze mnie.

0

Dziękuję za Wasze odpowiedźi:)
Ucieszyłem się, że działa jak należy, ale po przeanalizowaniu stwierdzam, że jednak żadna z metod nie działa dobrze:( i cholera nie wiem czemu:(

Zauważcie, że w każdej z waszych metod przy jednokrotnym powiększeniu nie pojawia się pasek pionowego przewijania, ale powinien on tam jednak być i można się o tym przekonać zmieniając szerokość okna. Wysokość okna pozostaje bez zmin, więc ten pionowy pasek powinien tam być od razu.

Pozdrawim i czekam na dalsze pomysły
Tomek

0

Mam rozwiązanie:)
poczytałem toturiala http://download.oracle.com/javase/tutorial/uiswing/components/scrollpane.html i tam jest przykład ScrollDemo2, w którym paski się prawidłowo zmieniają.

tak więc Wasze rozwiązania były prawie dobre, ale trzeba jeszcze wywalic setPreferredSize(new Dimension(a,a)) z paintComponent(Graphics g){...} i dorzucić do metod:)

 
    public void powieksz(){
        a+=20;
        setPreferredSize(new Dimension(a,a));
        revalidate();
        repaint();
        
    }
        public void zmniejsz(){
        a-=20;
        setPreferredSize(new Dimension(a,a));
        revalidate();
        repaint();
    }

Dzięki za pomoc,
pozdrawiam:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1