Moving JScrollPane horizontally results in blured

2019-05-05 17:36发布

I have a TextArea inside JScrollPane inside standard JPanel.

    JPanel panelMain = new JPanel();
    panelMain.setBorder(titledBorder1);
    panelMain.setBounds(new Rectangle(2, 5, 970, 700));
    panelMain.setLayout(null);

    JTextArea fieldBody = new JTextArea();
    JScrollPane fieldBodyScrollPane = new JScrollPane(fieldBody);
    fieldBodyScrollPane.setBounds(70, 140, 790, 500);
    panelMain.add(fieldBodyScrollPane);

When I type enough text in a single row the horizontal knob appears - so far good. But when I start moving the knob left and right, the text gets blured (see image). Interestingly, nothing weird happens when I move the textarea up and down.

blured text in jscrollpane when scrolling horizontally

I use Ubuntu 12.04 with Unity. This graphic artifact never appeared to me before. Any hints what could be the problem?

3条回答
Animai°情兽
2楼-- · 2019-05-05 17:39

This problem happens in OpenJDK (6 and 7, at least; and at least on Linux), and does not happen in Oracle Java 6 and 7 (on Linux).

The workaround suggested by mKorbel works for me:

scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);

So I guess it's a bug in OpenJDK.

查看更多
狗以群分
3楼-- · 2019-05-05 17:52

Here's @Andrew's SSCCE displaying itself; it looks the same with either Ambience or Radiance.

image

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.1 LTS
Release:    12.04
Codename:   precise
$ java -version
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1)
OpenJDK Client VM (build 20.0-b12, mixed mode, sharing)

Addendum: Looking closer at your screenshot, failing to honor the opacity property can cause such rendering artifact, and the default setting may vary among Look & Feel implementations.

查看更多
倾城 Initia
4楼-- · 2019-05-05 17:59
import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.border.*;

public class CaseForLayoutsNumber547 {

    CaseForLayoutsNumber547() {
        Border titledBorder1 = new TitledBorder("Case for Layouts #547");
        // START: code snippet variant
        JPanel panelMain = new JPanel(new GridLayout());
        panelMain.setBorder(titledBorder1);

        JTextArea fieldBody = new JTextArea(5,40);
        JScrollPane fieldBodyScrollPane = new JScrollPane(fieldBody);
        panelMain.add(fieldBodyScrollPane);
        // END: code snippet variant
        JOptionPane.showMessageDialog(null, panelMain);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                new CaseForLayoutsNumber547();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

I do not see any scroll artifacts in this SSCCE. Do you?

查看更多
登录 后发表回答