java 带GridLayout面板的JScrolllist

jrcvhitl  于 12个月前  发布在  Java
关注(0)|答案(1)|浏览(95)

我有一个JFrame(frame)和一个JScrollbox。JScrollbox包含我的ContainerJComponent(DebugPanel)。这个ContainerJComponent包含JScriptItem(DebugItem)。这是一个从我的项目中抽象出来的问题,目的是为了理解。
FRAME我创建一个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);
    }

}

字符串
PANEL为了简单起见,本例中的面板占据了整个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());
        
    }
}


然而,要绘制的比例并没有被考虑在内。JScrollbox是无用的,因为所有的项目总是填满面板。有人知道一个提示吗?类是孤立工作的。代码是完整的,除了对包的引用和导入。只需在main方法中调用generateGUI()。

nmpmafwu

nmpmafwu1#

在我看来,你想要一个完全填满JScrollbar高度的面板,而添加到该面板的组件的宽度与高度相关。因此,你永远不会有垂直滚动条。
如果是这样,那么我认为你可以使用Scrollable Panel。这将允许面板填充滚动窗格。由于高度将是已知的,其他组件的宽度可以计算。
基本示例:

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);
        }
    }

}

字符串

相关问题