Zmiana pozycji suwaków JScrollPane

0

Witam wszystkich bardzo serdecznie!
Od kilku tygodni próbuję pisać programy w Javie, nie posiadając wcześniejszego doświadczenia w programowaniu.
O ile do tej pory jakoś sobie radziłem, ostatnio natrafiłem na problem którego nie potrafię rozwiązać.

Zatem nie przeciągając już więcej: mam problem ze zmianą pozycji suwaków JScrollPane poprzez wykorzystanie JButton.

Struktura mojego programu wygląda następująco:

user image

Składnia xFrame:

package xframe;

import java.awt.FlowLayout;
import javax.swing.JFrame;

public class XFrame extends JFrame implements xInterface{
    
    public XFrame(){
        setTitle("xFrame");
        setSize(400, 400);
        setLocation(400, 200);
        setResizable(false);
        setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        add(panel_1);
        add(panel_2);
        
        setVisible(true);
    }

    public static void main(String[] args) {
        new XFrame();
    }
    
}

Składnia xInterface:

package xframe;

public interface xInterface {
    
    xPanel_1 panel_1 = new xPanel_1();
    xPanel_2 panel_2 = new xPanel_2();
    
}

Okno programu składa się więc z dwóch oddzielnych elementów:
user image

JPanel panel_1 zawiera w sobie JScrollPane w którym chcę zmienić pozycję suwaków, natomiast JPanel panel_2 przechowuje JButton który tą pozycję ma zmienić na 0, 0.
user image

Składnia xPanel_1:

package xframe;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class xPanel_1 extends JPanel{
    
    JScrollPane xScrollPane;
    
    public xPanel_1(){
        setPreferredSize(new Dimension(400, 300));
        setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        setBackground(Color.orange);
        
        xScrollPane = new JScrollPane(new JLabel(new ImageIcon("xImageIcon.png")));
        xScrollPane.setPreferredSize(new Dimension(400, 300));
        
        xScrollPane.getViewport().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                System.out.println("y" + xScrollPane.getVerticalScrollBar().getValue() + " " + "x" + xScrollPane.getHorizontalScrollBar().getValue());
            }
        });
        
        add(xScrollPane);
    }
    
    void xScroll(){
        xScrollPane.getViewport().setViewPosition(new Point(0, 0));
        System.out.println("Wciśnięto Przycisk!");
        System.out.println("y" + xScrollPane.getVerticalScrollBar().getValue() + " " + "x" + xScrollPane.getHorizontalScrollBar().getValue());
    }
    
}

Składnia xPanel_2:

package xframe;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class xPanel_2 extends JPanel{
    
    public xPanel_2(){
        setPreferredSize(new Dimension(400, 100));
        setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        setBackground(Color.darkGray);
        
        JButton xButton = new JButton("xButton");
        xButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                xPanel_1 panel = new xPanel_1();
                panel.xScroll();
            }
        });
        
        add(xButton);
    }
    
}

Po wciśnięciu xButton pozycja suwaków w xScrollPane nie ulegała zmianie. Chcąc przyjrzeć się problemowi bliżej dodałem do programu wypisywanie pozycji suwaków xScrollPane.
user image
Jak widać na załączonym obrazku, wartości po kliknięciu na przycisk zostają zmienione na 0, 0, program jednak ignoruje tą zmianę.

Rozwiązania tego problemu szukałem od kilku dni, jednak nie udało mi się znaleźć niczego co by mi pomogło.

Z góry dziękuję za wszelką udzieloną pomoc.
Pozdrawiam.

0

Co Ty nazywasz zmianą pozycji JScrollPane? Przesunięcie suwaków, czy przesunięcie całego panelu?

0

Przepraszam za niesprecyzowanie. Chodzi mi o przesunięcie suwaków.

PS
Poprawiłem mój wcześniejszy post zaznaczając że problem stanowi zmiana pozycji suwaków.

0

Po kliknięciu przycisku, niczego nie robisz z istniejącym JScrollPanelem, tworzysz nowy, niewyświetlany panel. Współrzędne 0,0 dotyczą tego niewidocznego panelu.

     xPanel_1 panel = new xPanel_1();
     panel.xScroll();

Musiałbyś usuwać istniejący JScrollPane i na jego miejsce dodawać nowo utworzony. Wymaga to współpracy różnych klas, np klasa xPanel_2 przechowuje referencję do głównego okna (klasa XFrame).

0

Wielkie dzięki za pomoc!

Zatem, by uniknąć tworzenia nowego JScrollPane a jedynie zmodyfikować pozycję suwaków w już istniejącym obiekcie, do klasy xPanel_2 zaimplementowałem xInterface, oraz zmieniłem ActionListener na

xButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        panel_1.xScrollPane.getViewport().setViewPosition(new Point(0, 0));
    }
});

Problem rozwiązany.
Pozdrawiam.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.