Nie mogę zrozumieć, dlaczego ten kod pojawia się paski przewijania. Jestem kompletnym początkującym w huśtawce, więc Scrollanów są bardzo mylące i nie rozumiem niektórych rozwiązań, które widziałem online. Irytującą rzecz jest krótko pracował ten kod, ale zniszczyłem pomyślną część przed podjęciem jej podczas próby dodania komponentu. Każda pomoc byłaby doceniana!

import javax.swing.*;
import java.awt.*;

public class Test extends JFrame
{
    private JPanel leftPanel;
    private JButton myButton;
    private JPanel scrollPanel;
    private JScrollPane scrollPane;
    
    public static void main(String[] args)
    {
        System.setProperty("swing.defaultlaf", "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run() {
                new Test();
            }
        });
    }
    
    /**
     * Constructor for objects of class Backup
     */
    public Test()
    {
        this.setTitle("testy");
        this.setSize(new Dimension(1280,622));
        
        leftPanel = new JPanel();
        leftPanel.setBackground(new Color(255,0,0));
        leftPanel.setBounds(0, 100, 640, 558);
        leftPanel.setEnabled(true);
        this.add(leftPanel);
        
        scrollPanel = new JPanel(null);
        scrollPanel.setBackground(new Color(100,100,100));
        scrollPanel.setPreferredSize(new Dimension(640, 550));
        scrollPanel.setEnabled(true);
        
        JScrollPane scrollPane = new JScrollPane(scrollPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
        JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setBounds(0, 0, 642, 550);
        scrollPane.setEnabled(true);
        leftPanel.add(scrollPane);
        
        for (int i = 1; i < 30; i++) 
        {
            scrollPanel.setLayout(new GridLayout(30, 1, 0, 1));
            myButton = new JButton("AAAAAAAAAAAAAAAAAAAAA " + i);
            myButton.setPreferredSize(new Dimension(630, 70));
            scrollPanel.add(myButton);
        }
        
        this.setBackground(new Color(0,0,0));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
}
}

Myślę, że od tego czasu, dzięki temu Camickr jest obecna wersja:

   import javax.swing.*;
   import java.awt.*;

    public class Test extends JFrame
    {
    private JPanel leftPanel;
    private JButton myButton;
    private JPanel scrollPanel;
    private JScrollPane scrollPane;

    public static void main(String[] args)
    {
    System.setProperty("swing.defaultlaf", 
    "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    javax.swing.SwingUtilities.invokeLater(new Runnable()
    {
        public void run() {
            new Test();
        }
    });
    }


    public Test()
    {
    this.setTitle("testy");
    this.setSize(new Dimension(1280,622));
    
    leftPanel = new JPanel();
    leftPanel.setBackground(new Color(255,0,0));
    leftPanel.setBounds(0, 100, 640, 558);
    this.add(leftPanel);
    
    scrollPanel = new JPanel();
    scrollPanel.setLayout(new GridLayout(70, 1, 0, 1));
    //scrollPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 
    20));
    scrollPanel.setBackground(new Color(100,100,100));
    //scrollPanel.setPreferredSize(new Dimension(640, 550));
    
    //JScrollPane scrollPane = new JScrollPane(scrollPanel);
    JScrollPane scrollPane = new JScrollPane(scrollPanel, 
    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    //scrollPane.setLayout(new GridLayout(30, 1, 0, 1));
    //scrollPane.setBounds(0, 0, 642, 550);
    scrollPane.setEnabled(true);
    //scrollPanel.add(scrollPane);
    
    leftPanel.add(scrollPanel);

    for (int i = 1; i < 71; i++) 
    {
        myButton = new JButton("AAAAAAAAAAAAAAAAAAAAA " + i);
        //myButton.setPreferredSize(new Dimension(640, 80));
        scrollPanel.add(myButton);
    }
    
    this.setBackground(new Color(0,0,0));
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.pack();
    this.setVisible(true);
    }}
0
Tomato 20 listopad 2020, 23:36

1 odpowiedź

Najlepsza odpowiedź
  1. Nie używaj układu zerowego.

  2. Nie używaj Setbounds ().

  3. Nie używaj SetPreFerredSize ().

Każdy składnik wahadłowy jest odpowiedzialny za określanie własnego korzystnego rozmiaru. Menedżer układu ustawia rozmiar / położenie każdego składników dodanej do panelu, a następnie (dynamicznie) obliczył preferowany rozmiar panelu. Paski przewijania pojawią się, gdy korzystny rozmiar panelu jest większy niż rozmiar okienka przewijania.

    scrollPanel = new JPanel(null);
    scrollPanel.setBackground(new Color(100,100,100));
    // scrollPanel.setPreferredSize(new Dimension(640, 550)); // delete
    //scrollPanel.setEnabled(true); // not needed
    ...

    for (int i = 1; i < 30; i++) 
    {
        //scrollPanel.setLayout(new GridLayout(30, 1, 0, 1)); // set layout when panel created.
        //myButton.setPreferredSize(new Dimension(630, 70)); // not needed.
  1. Menedżer układu należy ustawić poza pętlą, gdy utworzysz panel. Nie powinno być null.

  2. Nie ciężki kod preferowany rozmiar. Nie będzie regulować dynamicznie, ponieważ składniki są dodawane.

  3. Ustawienia huśtawki są domyślnie włączone, aby ustawić funkcję nie jest potrzebne.

  4. Nie używaj "leftpanel". Wystarczy dodać panel przewijania bezpośrednio do ramy. Spowoduje to dynamicznie zmienić rozmiar scrollpane, gdy ramka zostanie zmieniona. Następnie paski przewijania pojawią się podczas wymagań.

  5. Nie ustawiaj rozmiaru preferowania przycisku. Rozmiar zostanie określony na podstawie tekstu i czcionki przycisku.

2
camickr 20 listopad 2020, 20:50