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

Odpowiedz Nowy wątek
2011-09-07 15:18
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

edytowany 2x, ostatnio: Tompey, 2011-09-07 15:20

Pozostało 580 znaków

2011-09-07 16:58
bo
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);
    }

Pozostało 580 znaków

2011-09-07 16:59
0

Dodaj revalidate() do metody powieksz().

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

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

edytowany 2x, ostatnio: szypxx, 2011-09-07 17:12
Przecież podałem rozwiązanie. Myślisz, że prostych sposobów nie próbowałem? - bogdans 2011-09-07 17:44
rzeczywiście - jedyne co zauważyłem z twojego sposobu to validate() ;) ale mój sposób też działa więc nie rozumiem sensu tych 'machinacji' z remove itp. Chyba że twój sposób to revalidate 'od środka' metody albo inaczej mówiąc z bebechami na wierzchu. - szypxx 2011-09-07 18:20

Pozostało 580 znaków

2011-09-07 18:38
bo
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();
        }});

Pozostało 580 znaków

2011-09-07 18:47
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.

Pozostało 580 znaków

2011-09-08 07:53
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

edytowany 1x, ostatnio: Tompey, 2011-09-08 11:10

Pozostało 580 znaków

2011-09-08 13:08
0

Mam rozwiązanie:)
poczytałem toturiala http://download.oracle.com/ja[...]ng/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:)

edytowany 1x, ostatnio: Tompey, 2011-09-08 13:10
Jest przecież coś w stylu "always on top" czy coś w tym stylu - szypxx 2011-09-08 14:40

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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