Отставание в окне при первом отображении изображений с помощью JScrollPane - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь отобразить группу ImagePanels в JScrollPane.Проблема с этим приложением заключается в том, что каждый раз, когда новый ряд панелей входит в область просмотра, все окно останавливается на некоторое время.Однако после прокрутки до конца окно больше не будет отставать.

В чем причина этого отставания и как я могу предотвратить его появление?

Мне кажется,панели не окрашены, пока они не прокручиваются до.Поэтому я попытался вызвать перерисовку на них после добавления их в фон, но это не сработало: (

MainClass.java:

import javax.swing.SwingUtilities;

public class MainClass {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MainFrame frame = new MainFrame();
            }
        });
    }
}

MainFrame.java:

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

public class MainFrame extends JFrame {

    private static final long serialVersionUID = -254980289568295701L;

    public MainFrame() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(JFrame.MAXIMIZED_BOTH);

        JPanel background = new JPanel();
        JScrollPane scrollPane = new JScrollPane(background,
                 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        ImagePanel ipanel;

        background.setPreferredSize(new Dimension(this.getWidth(),
                                              this.getHeight() + 3000));    

        scrollPane.setOpaque(false);
        scrollPane.getViewport().setOpaque(false);
        scrollPane.getVerticalScrollBar().setUnitIncrement(20);
        add(scrollPane);

        for (int i = 0; i < 40; i++) {
            ipanel = new ImagePanel();
            ipanel.setPreferredSize(new Dimension(300, 400));
            ipanel.setSize(new Dimension(300, 400));

            background.add(ipanel);
        }

        setVisible(true);
    }
}

ImagePanel.java:

import java.awt.*;
import javax.swing.JPanel;
import java.awt.image.BufferedImage;

public class ImagePanel extends JPanel {

    private static final long serialVersionUID = 1997246878999790104L;
    private Image image;
    private int width;
    private int height;

    public ImagePanel() {
    width = 300;
    height = 400;
    BufferedImage bufferedImage = new BufferedImage(2000, 2000, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = bufferedImage.createGraphics();
    g2d.setColor(Color.white);
    g2d.fillRect(0, 0, 2000, 2000);
    g2d.setColor(Color.black);
    g2d.fillOval(0, 0, 2000, 2000);
    g2d.setColor(Color.yellow);
    g2d.fillOval(1500, 300, 400, 400);
    g2d.fillOval(1200, 600, 400, 400);
    g2d.fillOval(900, 900, 400, 400);
    g2d.fillOval(600, 1200, 400, 400);
    g2d.fillOval(300, 1500, 400, 400);
    g2d.dispose();
    image = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }
}

1 Ответ

0 голосов
/ 04 декабря 2018

Я изменил ваш код на JLabel для отображения изображения.

Загрузка длится дольше, но прокрутка работает нормально:

import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;

//public class ImagePanel extends JPanel {
public class ImagePanel extends JLabel {

    private static final long serialVersionUID = 1997246878999790104L;
    private Image image;
    private int width;
    private int height;

    public ImagePanel() {
    width = 300;
    height = 400;
    BufferedImage bufferedImage = new BufferedImage(2000, 2000, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = bufferedImage.createGraphics();
    g2d.setColor(Color.white);
    g2d.fillRect(0, 0, 2000, 2000);
    g2d.setColor(Color.black);
    g2d.fillOval(0, 0, 2000, 2000);
    g2d.setColor(Color.yellow);
    g2d.fillOval(1500, 300, 400, 400);
    g2d.fillOval(1200, 600, 400, 400);
    g2d.fillOval(900, 900, 400, 400);
    g2d.fillOval(600, 1200, 400, 400);
    g2d.fillOval(300, 1500, 400, 400);
    g2d.dispose();
    image = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
    setIcon( new ImageIcon(image) );
    }

//    @Override
    protected void xxxpaintComponent(Graphics g) {
        super.paintComponent(g);
//        g.drawImage(image, 0, 0, this);
        g.drawImage(image, 0, 0, null);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...