jscrollpane имеет конечное изображение - PullRequest
1 голос
/ 03 августа 2011

enter image description here

У меня внутри JScrollPane есть JPanel, и он делает это всякий раз, когда я пытаюсь прокрутить. Пожалуйста помоги! Как мне это исправить?

EDIT

JScrollPane pane;
....
pane = new JScrollPane(GC.createGraph());
pane.setPreferredSize(new Dimension(480,480*2/3));

Ответы [ 2 ]

3 голосов
/ 03 августа 2011

Размещение в качестве ответа для других, чтобы увидеть.Если вы не вызовете super.paintComponent, вы получите эти артефакты.например,

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.*;

public class ScrollPaneArtifacts extends JPanel {
   private static final int SPA_WIDTH = 600;
   private static final int SPA_HEIGHT = SPA_WIDTH;

   @Override
   protected void paintComponent(Graphics g) {
      //super.paintComponent(g);
      g.setColor(Color.red);
      g.drawLine(0, 0, getWidth(), getHeight());
      g.drawLine(getWidth(), 0, 0, getHeight());
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(SPA_WIDTH, SPA_HEIGHT);
   }

   private static void createAndShowUI() {
      JScrollPane scrollpane = new JScrollPane(new ScrollPaneArtifacts());
      scrollpane.getViewport().setPreferredSize(new Dimension(400, 400));
      JFrame frame = new JFrame("ScrollPaneArtifacts");
      frame.getContentPane().add(scrollpane);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
0 голосов
/ 19 марта 2013

Вам не нужно вызывать super.paintComponent, вы можете просто очистить область, чтобы убедиться, что на панели не осталось артефактов от предыдущего рендеринга (что будет делать вызов super.paintComponent).

@Override
protected void paintComponent(Graphics g) {
  g.clearRect(0,0,getWidth(),getHeight());
  g.setColor(Color.red);
  g.drawLine(0, 0, getWidth(), getHeight());
  g.drawLine(getWidth(), 0, 0, getHeight());
}

Попробуйте, если хотите, в коде на воздушной подушке.

...