【问题标题】:jscrollpane has trailing imagejscrollpane 有尾随图像
【发布时间】:2011-10-18 14:46:31
【问题描述】:

我在 JScrollPane 中有一个 JPanel,每当我尝试滚动时它都会这样做。请帮忙! 我该如何解决这个问题?

编辑

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

【问题讨论】:

  • 您的代码中有一个错误会绘制您持有的 JPanel,例如可能缺少对 super.paintComponent(...) 或 super.paint(...) 的调用,但是,但没有代码,我不确定我们如何为您提供帮助。请考虑创建和发布sscce
  • 到底发生了什么?即使你滚动 100% 你有隐藏在下面的内容?向右还是向下?
  • 将功能正常的 JPanel 投入 JScrollPane 后没有代码,当我尝试滚动时,scrollPane 会创建工件。并且图片(完整)应该是一个大而细的X。
  • 总有代码——你怎么画这个又大又细的X?你是在 JPanel 的 paintComponent 方法中这样做的吗? 再次你是在调用超级方法吗?
  • ...有一天我想知道我为什么要编程...谢谢。

标签: java image jpanel jscrollpane visual-artifacts


【解决方案1】:

放置作为其他人看到的答案。如果您不调用 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();
         }
      });
   }
}

【讨论】:

    【解决方案2】:

    您不需要调用 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());
    }
    

    如果你愿意,可以在 Hovercrafts 代码中试试这个。

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 2017-01-21
      • 2013-02-15
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 2015-08-30
      相关资源
      最近更新 更多