Как сделать так, чтобы при размещении динамически изменяемой JPanel в JScrollPane она работала?

#java #swing #jframe #jpanel #jscrollpane

#java #качать #jframe #jpanel #jscrollpane

Вопрос:

Итак, я создал программу, в которой размер JPanel динамически обновляется нажатием кнопки, а обновленная панель добавляется в JScrollPane. Но я не совсем понимаю ошибку в этом коде. Панель исчезает при нажатии кнопки вместо того, чтобы изменять размер и помещать в область прокрутки. Помощь была бы очень признательна, поскольку я довольно новичок в Swing.

код (надеюсь, я все делаю правильно) :-

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

public class Frame extends JFrame implements ActionListener{
    int scrollBarSize;
    JButton button;
    JPanel buttonPanel;
    JPanel panel = new JPanel();
    JScrollPane pane = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    JTextField text;
    
    int bigPanelPos = 495, bigPanelSize = 55 , smallPanelPos;

    Frame(){
        this.setSize(700,700);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setLayout(null);
        scrollBarSize = ((Integer)UIManager.get("ScrollBar.width"))   1;

        pane.setBounds(0,0,700,550);
        
        panel.setBackground(Color.yellow);
        panel.setBounds(0,495,700,55);
        panel.setAlignmentX(Component.CENTER_ALIGNMENT);
        panel.setAlignmentY(Component.CENTER_ALIGNMENT);

        button = new JButton("Click me!");
        button.setPreferredSize(new Dimension(50,15));
        button.setFont(new Font("Didot",Font.BOLD, 15));
        button.addActionListener(this);
        
        buttonPanel = new JPanel();
//      buttonPanel.setPreferredSize(new Dimension(700, 150));
        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
        buttonPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        buttonPanel.setAlignmentY(Component.CENTER_ALIGNMENT);
        buttonPanel.setBorder(BorderFactory.createTitledBorder("ButtonPanel"));
        buttonPanel.setBounds(0, 550, 700, 150 );
        buttonPanel.add(button);
        
        this.add(panel);
        this.add(buttonPanel);
        this.setVisible(true);
        
    }
    
    public void actionPerformed(ActionEvent e) {
        
        if (e.getSource() == button) {
            
            bigPanelPos -= 55;
            bigPanelSize  =55;
            
            int n = scrollBarSize;
            panel.setPreferredSize(new Dimension(700 - n,bigPanelSize));
            panel.setAlignmentX(Component.CENTER_ALIGNMENT);
            panel.setAlignmentY(Component.CENTER_ALIGNMENT);
            panel.revalidate();
            pane.add(panel);
            pane.revalidate();
            this.add(pane);
//          this.add(panel);
            System.out.println(pane.getBounds());
            System.out.println(panel.getBounds());
            
        }
        
    }
    
}

 

Ответ №1:

Не используйте нулевой макет.

Определение размера / расположения компонентов является задачей менеджера компоновки. Полосы прокрутки панели прокрутки будут отображаться только тогда, когда предпочтительный размер панели больше размера панели прокрутки.

Не добавляйте панель в фрейм

Панель является дочерним компонентом панели прокрутки. Панель должна быть добавлена в область просмотра панели прокрутки, а панель прокрутки должна быть добавлена в рамку.

Вы добавляете панель в окно просмотра, используя либо:

 JScrollPane pane = new JScrollPane(panel,  JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
 

или

 panel.setViewportView( panel );
 

Прочитайте руководство по Swing для основы Swing. Есть разделы «менеджеры компоновки» и «Как использовать панель прокрутки» с дополнительной информацией и примерами.