Полосы прокрутки на основе содержимого jpanel

У меня есть панель jpanel размером 500x500, которая действует как холст (рисует на нем все). Полосы прокрутки включаются (по мере необходимости) в разрешении 510 x 510 на панели (которого она никогда не достигнет визуально, но превзойдет в зависимости от содержимого), а 500 x 500 представлено как 1:1 (масштаб).

Ниже показано увеличенное изображение строки, как видно, окно просмотра остается прежним, а полосы прокрутки не появляются, установка полос прокрутки на всегда приводит к отключению полос.

JScrollPane scrollPanel = new JScrollPane(JPanel,
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);

Полосы прокрутки на основе содержимого jpanel

Как мне сделать так, чтобы полосы прокрутки читали содержимое этой панели и становились прокручиваемыми? Я не могу найти ничего подходящего для этого

Прикрепленная панель становится больше, но полоса прокрутки не считывает это изменение. Есть ли какое-то обновление, которое мне нужно вызвать, которого у меня нет (думая об этом, у меня явно нет ничего, вызывающего обновление? но я также не смог найти ничего подходящего по этому поводу)

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

Sergiy Medvynskyy 29.05.2019 08:19

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

Anan 29.05.2019 08:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что вам нужно, так это реализовать прокручиваемый интерфейс для вашей панели, который помещается в 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;
    }
}

Другие вопросы по теме