JScrollPane 与 GridLayout 面板

问题描述 投票:0回答:1

我有一个带有 JScrollPane 的 JFrame (

frame
)。 JScrollPane 包含我的 ContainerJComponent (
DebugPanel
)。此 ContainerJComponent 包含 JComponentItems (
DebugItem
)。这是我的项目中为了理解而抽象的问题。

框架 我创建了一个 JFrame。 For 循环用于为面板创建示例项目。

public class DebugGUI {
    
    private static JFrame frame;
    private static DebugPanel panel = new DebugPanel();
    
    public static void generateGUI() {
        
        
        frame = new JFrame();
        
        
        for (int i = 1; i < 20; i++) {
            panel.addItem(0.2);
        }
        
        frame.setContentPane(new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS));
        frame.setVisible(true);
    }

}

面板 为了简单起见,本例中的面板占据了整个 JFrame 区域。该面板充当容器,其中又包含项目 - 在本例中是通过 For 循环添加的 20 个项目。

public class DebugPanel extends JComponent {
    
    private static final long serialVersionUID = -7384855597611519487L;
    private LinkedList<DebugItem> items = new LinkedList<>();
    
    public DebugPanel() {
        GridLayout layout = new GridLayout();
        layout.setRows(1);
        this.setLayout(layout);
    }
    
    public void addItem(double widthRatio) {
        DebugItem item = new DebugItem(widthRatio);
        items.add(item);
        add(item);
    }


    @Override
    protected void paintComponent(Graphics g) {
        this.setPreferredSize(new Dimension((int) getPreferredSize().getWidth(), getParent().getHeight()));
        super.paintComponent(g);
        for (DebugItem item : items) {
            item.resize((int) getPreferredSize().getHeight());
        }
        
    }
}

项目 这些项目应该在面板中绘制一些内容。在我的示例中,这是一个矩形。该矩形应填充面板的整个高度,并相对于高度保持一定的宽度。

public class DebugItem extends JComponent {

    private static final long serialVersionUID = 1630268284249666775L;
    private double widthRatio;
    private int width;
    
    DebugItem(double widthRatio) {
        this.widthRatio = widthRatio;
    }
    
    void resize(int height) {
        width = (int) (height * widthRatio);
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.drawRect(0, 0, width, getParent().getHeight());
        
    }
}

但是,不考虑提取的比例。 JScrollPane 没有用,因为所有项目总是填充面板。有谁知道提示吗?课程是孤立进行的。除了对包和导入的引用之外,代码是完整的。只需在主方法中调用generateGUI()即可。

java swing jscrollpane
1个回答
0
投票

在我看来,您想要一个完全填充 JScrollPane 高度的面板,并且添加到该面板的组件的宽度与高度相关。因此你永远不会有垂直滚动条。

如果是这样,那么我认为您可以使用可滚动面板。这将允许面板填充滚动窗格的高度。宽度将根据添加的组件数量和宽度比来确定。根据需要会出现水平滚动条。

基本示例:

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

public class DebugGUI {

    public static void main(String[] args)
    {
        JFrame frame = new JFrame();

        ScrollablePanel panel = new ScrollablePanel( new GridLayout(1, 0) );
        panel.setScrollableHeight( ScrollablePanel.ScrollableSizeHint.FIT );

        for (int i = 0; i < 5; i++) {
            panel.add( new DebugItem(0.2) );
        }

        frame.setContentPane(new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_NEVER,
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS));
        frame.setSize(400, 400);
        frame.setVisible(true);
    }

    static class DebugItem extends JComponent {

        private double widthRatio;

        DebugItem(double widthRatio) {
            this.widthRatio = widthRatio;
        }

        public Dimension getPreferredSize()
        {
            Dimension parent = super.getSize();

            return new Dimension((int)(parent.height * widthRatio), parent.height);
        }

        @Override
        protected void paintComponent(Graphics g) {
            // TODO Auto-generated method stub
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.