Java 自定义JComponent以设置首选的可滚动视口大小

Java 自定义JComponent以设置首选的可滚动视口大小,java,swing,jscrollpane,preferredsize,jviewport,Java,Swing,Jscrollpane,Preferredsize,Jviewport,因此,我试图创建一个自定义组件,以便设置滚动窗格的大小。以下是带有滚动窗格的部分: JScrollPane scrollPane = new JScrollPane(leftTop); customScroll t1 = new customScroll(); scrollPane.add(t1); left.add(scrollPane); leftTop是左侧面板内部的嵌套面板。这是我的customScroll类,它是我正在制作的自定义组件,因此我可以设置滚动窗格的大小: public c

因此,我试图创建一个自定义组件,以便设置滚动窗格的大小。以下是带有滚动窗格的部分:

JScrollPane scrollPane = new JScrollPane(leftTop);
customScroll t1 = new customScroll();
scrollPane.add(t1);
left.add(scrollPane);
leftTop是左侧面板内部的嵌套面板。这是我的customScroll类,它是我正在制作的自定义组件,因此我可以设置滚动窗格的大小:

public class customScroll extends JComponent implements Scrollable {

    public customScroll() {
        getPreferredScrollableViewportSize();
    }

    @Override
    public Dimension getPreferredScrollableViewportSize() {
        return(new Dimension(266,300));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g); 
    }

    @Override
    public int getScrollableBlockIncrement(Rectangle visibleRect,
            int orientation, int direction) {
        return 0;
    }

    @Override
    public boolean getScrollableTracksViewportHeight() {
        return false;
    }

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return false;
    }

    @Override
    public int getScrollableUnitIncrement(Rectangle visibleRect,
            int orientation, int direction) {
        return 0;
    }
}
如何设置首选的可滚动大小?

提供设置程序

public void setPreferredScrollableViewportSize(Dimension size) {
    this.preferredScrollableViewportSize = size;
}
现在,显然,您的
getPreferredScrollableViewportSize
需要返回此值

public class CustomScroll extends JComponent implements Scrollable {

    private Dimension preferredScrollableViewportSize = new Dimension(266, 300);

    public CustomScroll() {
    }

    public void setPreferredScrollableViewportSize(Dimension size) {
        this.preferredScrollableViewportSize = size;
    }

    @Override
    public Dimension getPreferredScrollableViewportSize() {
        return preferredScrollableViewportSize;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
    }

    @Override
    public int getScrollableBlockIncrement(Rectangle visibleRect,
                    int orientation, int direction) {
        return 64;
    }

    @Override
    public boolean getScrollableTracksViewportHeight() {
        return false;
    }

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return false;
    }

    @Override
    public int getScrollableUnitIncrement(Rectangle visibleRect,
                    int orientation, int direction) {
        return 64;
    }
}
在包装
JScrollPane
之前也应该设置此选项,这样会更容易管理,否则,您需要
invalidate
使
JScrollPane
所在的容器失效

您可能希望有一个通读版本,这将使人们更容易阅读您的代码,您也更容易阅读其他代码


但这仍然是首选尺寸

不,它不会,它将使用
preferredScrollableViewportSize
(假设您在
JScrollPane

我的滚动窗格会根据其中的内容进行调整,因此它只会随着按钮的添加而增长

那你做错了什么

JScrollPane scrollPane = new JScrollPane(leftTop);    
customScroll t1 = new customScroll();
// This is wrong...
scrollPane.add(t1);
left.add(scrollPane);
您不应该向
JScrollPane
添加任何内容,这与它们的工作方式无关,相反,您需要将组件包装在其中

leftTop t1 = new CustomScroll();
JScrollPane scrollPane = new JScrollPane(leftTop);    
left.add(scrollPane);
或者类似的

我希望它保持一个固定的大小,所以我需要显式地设置一个它不能偏离的大小

是的,
preferredScrollableViewportSize
就是这么做的

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class JavaApplication57 {

    public static void main(String[] args) {
        new JavaApplication57();
    }

    public JavaApplication57() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            CustomScroll comp = new CustomScroll();
            comp.setPreferredScrollableViewportSize(new Dimension(100, 100));

            comp.setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.weightx = 1;
            gbc.insets = new Insets(5, 10, 10, 5);
            for (int index = 0; index < 100; index++) {

                JButton btn = new JButton("Hello world " + index);
                comp.add(btn, gbc);

            }

            add(new JScrollPane(comp));
        }

    }

    public class CustomScroll extends JComponent implements Scrollable {

        private Dimension preferredScrollableViewportSize = new Dimension(266, 300);

        public CustomScroll() {
        }

        public void setPreferredScrollableViewportSize(Dimension size) {
            this.preferredScrollableViewportSize = size;
        }

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return preferredScrollableViewportSize;
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
        }

        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect,
                        int orientation, int direction) {
            return 64;
        }

        @Override
        public boolean getScrollableTracksViewportHeight() {
            return false;
        }

        @Override
        public boolean getScrollableTracksViewportWidth() {
            return false;
        }

        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect,
                        int orientation, int direction) {
            return 64;
        }
    }
}

导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入java.awt.Rectangle;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.Scrollable;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类JavaApplication57{
公共静态void main(字符串[]args){
新JavaApplication57();
}
公共JavaApplication57(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
CustomScroll comp=新的CustomScroll();
组件设置PreferredScrollableViewPortSize(新维度(100100));
组件设置布局(新GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridwidth=GridBagConstraints.rements;
gbc.weightx=1;
gbc.插图=新插图(5,10,10,5);
对于(int-index=0;index<100;index++){
JButton btn=新JButton(“你好世界”+索引);
公司地址(btn、gbc);
}
添加(新的JScrollPane(comp));
}
}
公共类CustomScroll扩展JComponent实现可滚动{
私有维度preferredScrollableViewportSize=新维度(266300);
公共自定义卷轴(){
}
public void setPreferredScrollableViewportSize(维度大小){
this.preferredScrollableViewportSize=大小;
}
@凌驾
公共维度getPreferredScrollableViewportSize(){
返回preferredScrollableViewportSize;
}
@凌驾
公共组件(图形g){
超级组件(g);
}
@凌驾
public int getScrollableBlockIncrement(矩形visibleRect,
整数方向,整数方向){
返回64;
}
@凌驾
公共布尔值getScrollableTracksViewPerThight(){
返回false;
}
@凌驾
公共布尔值getScrollableTracksViewportWidth(){
返回false;
}
@凌驾
public int getScrollableUnitIncrement(矩形visibleRect,
整数方向,整数方向){
返回64;
}
}
}

请注意Java命名约定——特别是类名;另外,请提及您面临的具体问题。但这仍然只是获得首选大小,我的滚动窗格会根据其中的内容进行调整,以便随着按钮的添加而增长。我希望它保持固定大小,因此需要显式设置一个不能偏离f的大小rom.nvm我是弱智,无法阅读文档页面。尽管lol,你的答案是+1。