मैं स्क्रॉलबार के साथ एक कंटेनर बनाने की कोशिश कर रहा हूं और कंटेनर के अंदर दो आंतरिक पैनल हैं। शीर्ष आंतरिक पैनल के अंदर एक और JScrollPane भी है।

लेकिन वर्तमान में मुझे इस समस्या का सामना करना पड़ रहा है जब मेरा शीर्ष आंतरिक पैनल बहुत लंबा (चौड़ाई) है, शीर्ष आंतरिक पैनल के अंदर स्क्रॉल बार अक्षम है, मैं केवल कंटेनर के स्क्रॉल बार को स्क्रॉल करने में सक्षम हूं।

enter image description here

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestFrame {

    public static void main(String... args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        for (int i = 0; i < 10; i++) {
            panel.add(new JButton("Hello-" + i));
        }
        JScrollPane scrollPane = new JScrollPane(panel);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        JPanel contentPane = new JPanel(new BorderLayout());

        JPanel contentPaneSub = new JPanel();
        contentPaneSub.add(scrollPane);

        contentPane.add(contentPaneSub, BorderLayout.NORTH);

        JPanel centerPanel = new JPanel(new FlowLayout());
        centerPanel.add(new JButton("Example"));
        contentPane.add(centerPanel, BorderLayout.CENTER);

        JScrollPane scrollPane1 = new JScrollPane(contentPane);
        scrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);

        frame.setContentPane(scrollPane1);
        //for demo purpose we set this using hard coded way
        //in real life project the java will auto adjust it size based on windows resolution
        frame.setSize(new Dimension(500, 160));
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}

मुझे जो उम्मीद है वह यह है कि यदि शीर्ष आंतरिक पैनल चौड़ाई में बहुत लंबा है तो शीर्ष आंतरिक पैनल के अंदर स्क्रॉल बार दिखाई देगा और स्क्रॉल करने की अनुमति देगा। कंटेनर में स्क्रॉलबार नहीं।

0
user9054854 30 अगस्त 2019, 10:28

1 उत्तर

सबसे बढ़िया उत्तर

इस समस्या को हल करने की कोशिश कर रहे दो अलग-अलग मुद्दे हैं। पहला JScrollPane को विंडो के भीतर समाहित कर रहा था, और दूसरा गतिशील होने के लिए JScrollPane का आकार बदल रहा था।

मैं पहले मुद्दे को हल करने में सक्षम था लेकिन कस्टम क्लास का उपयोग करके दूसरे को पूरी तरह से हल नहीं कर पाया। विंडो बढ़ने पर JScrollPane गतिशील रूप से इसकी चौड़ाई बढ़ाता है, लेकिन यह विंडो के आकार के साथ गतिशील रूप से सिकुड़ता नहीं है। ऐसा इसलिए है क्योंकि जब विंडो का आकार कम हो जाता है, तो बाहरी JScrollPane अंदर की सामग्री की चौड़ाई को लॉक कर देता है, जिसमें आंतरिक JScrollPane भी शामिल है।

मैं बाहरी फलक की कार्यक्षमता को प्रभावी ढंग से हटाए बिना आंतरिक फलक को गतिशील रूप से सिकुड़ने का एक तरीका खोजने में असमर्थ था, जो काम नहीं करता है क्योंकि आपका प्रश्न विशेष रूप से एक JScrollPane के लिए एक अन्य कार्यात्मक JScrollPane के लिए था। .

public class TestFrame {

    public static void main(String... args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        for (int i = 0; i < 10; i++) {
            panel.add(new JButton("Hello-" + i));
        }

        MyCustomPane scrollPane = new MyCustomPane(panel); //changed this line

        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        JPanel contentPane = new JPanel(new BorderLayout());

        JPanel contentPaneSub = new JPanel();
        contentPaneSub.add(scrollPane);

        scrollPane.setOuterContainer(contentPaneSub); //added this line

        contentPane.add(contentPaneSub, BorderLayout.NORTH);

        JPanel centerPanel = new JPanel(new FlowLayout());
        centerPanel.add(new JButton("Example"));
        contentPane.add(centerPanel, BorderLayout.CENTER);

        JScrollPane scrollPane1 = new JScrollPane(contentPane);
        scrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);

        frame.setContentPane(scrollPane1);
        //for demo purpose we set this using hard coded way
        //in real life project the java will auto adjust it size based on windows resolution
        frame.setSize(new Dimension(500, 160));
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}

MyCustomPane वर्ग के लिए कोड:

public class MyCustomPane extends JScrollPane {
    Container outerContainer;

    public MyCustomPane(Component view) {
        super(view);
    }

    public void setOuterContainer(Container outerContainer) {
        this.outerContainer = outerContainer;
    }

    private Dimension getCustomDimensions() {
        if (outerContainer == null) {
            return new Dimension(0, 0);
        }
        return new Dimension(outerContainer.getWidth() - 10, 60); //10 pixels less than container width, arbitrary height
    }
    @Override
    public Dimension getMaximumSize() {
        return getCustomDimensions();
    }
    @Override
    public Dimension getMinimumSize() {
        return getCustomDimensions();
    }
    @Override
    public Dimension getPreferredSize() {
        return getCustomDimensions();
    }
}
0
Mihir Kekkar 30 अगस्त 2019, 17:58