Java 基于jpanel内容的滚动条

Java 基于jpanel内容的滚动条,java,swing,scrollbar,paint,jscrollpane,Java,Swing,Scrollbar,Paint,Jscrollpane,我有一个500x500的jpanel,用作画布(在上面画)。滚动条在面板上的510x510处启动(根据需要)(它在视觉上永远无法到达,但会根据内容超过),500x500表示为1:1(比例) 下面是放大的一行的表示,可以看到,视图窗口保持不变,没有滚动条弹出,将滚动条设置为始终导致禁用的滚动条 JScrollPane scrollpane=newjscrollpane(JPanel, ScrollPaneConstants.VERTICAL\u滚动条\u根据需要, ScrollPaneConsta

我有一个500x500的jpanel,用作画布(在上面画)。滚动条在面板上的510x510处启动(根据需要)(它在视觉上永远无法到达,但会根据内容超过),500x500表示为1:1(比例)

下面是放大的一行的表示,可以看到,视图窗口保持不变,没有滚动条弹出,将滚动条设置为始终导致禁用的滚动条

JScrollPane scrollpane=newjscrollpane(JPanel,
ScrollPaneConstants.VERTICAL\u滚动条\u根据需要,
ScrollPaneConstants.水平滚动条(根据需要);

如何让滚动条读取此面板的内容并使其可滚动?我找不到与此相关的任何信息


附加的面板变大,但滚动条无法读取此更改。是否需要调用某种我没有调用的更新(考虑到这一点,我没有显式地调用任何更新?但也找不到与此相关的任何内容)

您需要的是为面板实现可滚动的界面,该界面位于JScrollPane中,并覆盖方法
getPreferredSize()
。这是一个例子

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.WindowConstants;
import javax.swing.plaf.basic.BasicComboBoxRenderer;

public class ZoomPanel extends JPanel implements Scrollable {

    private static final int DEFAULT_SIZE = 500;

    private float zoom = 1f;

    @Override
    public Dimension getPreferredSize() {
        int size = Math.round(zoom * DEFAULT_SIZE);
        return new Dimension(size, size);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int size = Math.round(zoom * DEFAULT_SIZE);
        g.drawOval(0, 0, size, size);
    }

    private static class ZoomRenderer extends BasicComboBoxRenderer {

        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Object val = value;
            if (value instanceof Number) {
                val = Math.round(((Number) value).doubleValue() * 100) + "%";
            }
            return super.getListCellRendererComponent(list, val, index, isSelected, cellHasFocus);
        }
    }

    public static void main(String[] args) {
        JFrame frm = new JFrame("Zoom panel");
        ZoomPanel z = new ZoomPanel();
        JScrollPane scroller = new JScrollPane(z);
        Float[] zooms = {.5f, .75f, 1f, 1.5f, 2f, 4f};
        JComboBox<Float> combo = new JComboBox<>(zooms);
        combo.setSelectedIndex(2);
        combo.setRenderer(new ZoomRenderer());
        combo.addActionListener(e -> {
            Float v = (Float) combo.getSelectedItem();
            if (v != null) {
                z.zoom = v;
                scroller.revalidate();
                scroller.repaint();
            }
        });
        JPanel comboPanel = new JPanel();
        comboPanel.add(combo);
        frm.add(comboPanel, BorderLayout.NORTH);
        frm.add(scroller);
        frm.pack();
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

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

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

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

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

    @Override
    public boolean getScrollableTracksViewportHeight() {
        return false;
    }
}
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Rectangle;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.Scrollable;
导入javax.swing.WindowConstants;
导入javax.swing.plaf.basic.BasicComboxRenderer;
公共类ZoomPanel扩展JPanel实现可滚动{
私有静态最终int默认值_SIZE=500;
私有浮动缩放=1f;
@凌驾
公共维度getPreferredSize(){
int size=Math.round(缩放*默认大小);
返回新维度(大小、大小);
}
@凌驾
受保护组件(图形g){
超级组件(g);
int size=Math.round(缩放*默认大小);
g、 drawOval(0,0,大小,大小);
}
私有静态类ZoomRenderer扩展了BasicComboxRenderer{
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
对象值=值;
if(值instanceof Number){
val=数学四舍五入((数字)值).doubleValue()*100)+“%”;
}
返回super.getListCellRenderComponent(列表、val、索引、isSelected、cellHasFocus);
}
}
公共静态void main(字符串[]args){
JFrame frm=新JFrame(“缩放面板”);
ZoomPanel z=新的ZoomPanel();
JScrollPane scroller=新的JScrollPane(z);
Float[]缩放={.5f、.75f、1f、1.5f、2f、4f};
JComboBox组合=新的JComboBox(缩放);
组合设置选定索引(2);
setRenderer(新的ZoomRenderer());
combo.addActionListener(e->{
Float v=(Float)combo.getSelectedItem();
如果(v!=null){
z、 缩放=v;
scroller.revalidate();
scroller.repaint();
}
});
JPanel comboPanel=新的JPanel();
comboPanel.add(组合);
frm.add(组合面板,边框布局,北);
frm.add(滚动条);
frm.pack();
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setLocationRelativeTo(空);
frm.setVisible(真);
}
@凌驾
公共维度getPreferredScrollableViewportSize(){
返回getPreferredSize();
}
@凌驾
公共int getScrollableUnitIncrement(矩形visibleRect、int方向、int方向){
返回5;
}
@凌驾
公共int getScrollableBlockIncrement(矩形visibleRect、int方向、int方向){
返回20;
}
@凌驾
公共布尔值getScrollableTracksViewportWidth(){
返回false;
}
@凌驾
公共布尔值getScrollableTracksViewPerThight(){
返回false;
}
}

请提供一个示例,以便我们更好地了解您试图实现的目标。@Sergiy Medvynskyy滚动条不能随面板内的内容进行缩放。面板会增长,但滚动条不会显示所述增长