【问题标题】:Peculiar effect when scrolling JScrollPane滚动 JScrollPane 时的特殊效果
【发布时间】:2013-01-05 18:39:48
【问题描述】:

使用 JScrollArea 滚动时如何处理这种奇怪的效果:

代码:

import java.util.*;
import java.util.prefs.BackingStoreException;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.swing.*;

import javax.imageio.*;

public class Main extends JFrame implements ActionListener, AdjustmentListener{
    CustomComponent cc;
    JScrollPane jsp;

    public static void main(String[] args) {
        Main m = new Main();
    }

    public Main(){
        setTitle( "Diverse Testari 7");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(600, 400);

        cc = new CustomComponent();
        cc.setImage("rgbcmy.jpg");

        jsp = new JScrollPane( cc,
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
        jsp.setPreferredSize( new Dimension( getWidth(), getHeight() ) );
        jsp.setOpaque( true );
        jsp.setBackground( Color.DARK_GRAY );
        jsp.getVerticalScrollBar().addAdjustmentListener(this);
        jsp.getHorizontalScrollBar().addAdjustmentListener(this);
        setBackground( Color.red );

        add( jsp );
        setVisible( true );
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("EVENT: " + e.toString() );

    }

    @Override
    public void adjustmentValueChanged(AdjustmentEvent arg0) {
        // TODO Auto-generated method stub

    }

}

class CustomComponent extends JPanel{
    BufferedImage img = null;
    public void setImage( String str ){
        try {
            img = ImageIO.read( new File( str ) );
            System.out.println(img.getColorModel().toString());
            System.out.println("SUCCESS!");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public Dimension getPreferredSize() {
        // TODO Auto-generated method stub
        return new Dimension(img.getWidth(), img.getHeight() );
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setClip(100, 100, 100, 100);
        System.out.println("paintComponent");

        if( img != null )
        {
            System.out.println("Obs: Imagine existenta!");
            g2d.drawImage(img, null, 0,0);
        }
        else
        {
            System.out.println("Eroare: nu este imaginea!");
        }
    }//*/
}

【问题讨论】:

    标签: java swing jscrollpane paintcomponent jviewport


    【解决方案1】:

    尝试在 paintComponent 重写方法的开头调用 super.paintComponent(g)。像这样:

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // rest of the method's code
    

    希望这会有所帮助!祝你好运!

    【讨论】:

      【解决方案2】:

      这是paint code isn't optimized 的常见问题,通过禁用闪烁可以消除部分副作用,必须为JViewports ScrollMode 设置附加参数

      JViewport viewPort = jsp.getViewport();
      viewPort.setScrollMode(JViewport.BLIT_SCROLL_MODE);
      viewPort.setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
      viewPort.setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
      

      也通过super.paintComponent(g); 通知+1 for Óscar Gómez Alcañiz

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-11
        • 1970-01-01
        • 2012-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多