首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 6/ Swing:在JScrollPane的ViewPort /ViewPort组件之上绘制

Java 6/ Swing:在JScrollPane的ViewPort /ViewPort组件之上绘制
EN

Stack Overflow用户
提问于 2014-07-26 21:59:17
回答 1查看 444关注 0票数 0

我想要实现一个定制的JScrollPane,它能够在它自己的ViewPort /ViewPort组件的顶部的上绘制它的工作区。这方面的挑战是在用户滚动ViewPort时保持自定义的画图代码重新绘制,或者换句话说,ViewPort组件被重新绘制。

我的目标是与iOS (iPhone/iPad)的半透明滚动条(iPhone/iPad)具有相同的效果,该滚动条被呈现在可滚动列表(而不是经典的滚动条)之上。

这只是一个绘画问题,而不是关于滚动的问题:)

我已经有一些工作要做,如下所示(下面的代码仅在JScrollPane上呈现绿色测试行):

代码语言:javascript
复制
public class ScrollPaneTest
{
    private JFrame          frame;
    private TestScrollPane  scrollPane;
    private JTextArea       textArea;

    public static void main( String[] args ) throws Exception
    {
        UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );
        new ScrollpaneTest();
    }

    public ScrollPaneTest()
    {
        configureUi();

        SwingUtilities.invokeLater( new Runnable() {
            @Override public void run() {
                frame.setVisible( true );
            }
        } );
    }

    private void configureUi()
    {
        textArea = new JTextArea();
        textArea.setWrapStyleWord( true );
        textArea.setLineWrap( true );
        textArea.setOpaque( false );
        textArea.setText( "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor "
                + "invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo "
                + "duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor "
                + "sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor "
                + "invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et "
                + "justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum "
                + "dolor sit amet." );

        scrollPane = new TestScrollPane();
        scrollPane.setViewportView( textArea );
        scrollPane.setLocation( 50, 50 );
        scrollPane.setSize( 200, 200 );

        frame = new JFrame( getClass().getSimpleName() );
        frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
        frame.setLayout( null );
        frame.setSize( 340, 380 );
        frame.setLocationRelativeTo( null );

        frame.add( scrollPane );
    }
}

public class TestScrollPane extends JScrollPane
{
    public TestScrollPane()
    {
        setOpaque( true );
        setBackground( Color.WHITE );
    }

    @Override
    protected JViewport createViewport()
    {
        JViewport viewPort = super.createViewport();
        viewPort.setOpaque( false );

        return viewPort;
    }

    @Override
    protected void paintChildren( Graphics g )
    {
        super.paintChildren( g );

        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor( Color.GREEN );
        g2d.drawLine( 0, 0, 100, 100 );
    }

}

运行代码时,如下所示:

这里的关键是将ViewPort和ViewPort组件设置为非透明的:

代码语言:javascript
复制
// From: ScrollPaneTest.configureUi()
textArea.setOpaque( false );

以及:

代码语言:javascript
复制
// From: TestScrollPane.paintChildren()
JViewport viewPort = super.createViewport();
viewPort.setOpaque( false );

(如果不将这些设置为非透明的,JScrollPane将不会被重新绘制,而ViewPort组件( JTextArea)将重写绿线)。

现在我非常简单的问题是

有更好的方法吗?在这两个组件上都必须使用setOpaque( false)是不对的。

非常感谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-26 22:22:40

必须在这两个组件上使用setOpaque( false)只是感觉不对。

好吧,也许更容易点。您可以覆盖paintComponent()方法的JViewport,然后您只需要在文本区域使用setOpaque(false),而不必使用viewport :)

代码语言:javascript
复制
import java.awt.*;
import javax.swing.*;

public class ScrollPaneTest5
{
    private JFrame          frame;
    private JScrollPane  scrollPane;
    private JTextArea       textArea;

    public static void main( String[] args ) throws Exception
    {
        UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );
        new ScrollPaneTest5();
    }

    public ScrollPaneTest5()
    {
        configureUi();

        SwingUtilities.invokeLater( new Runnable() {
            @Override public void run() {
                frame.setVisible( true );
            }
        } );
    }

    private void configureUi()
    {
        textArea = new JTextArea();
        textArea.setWrapStyleWord( true );
        textArea.setLineWrap( true );
//        textArea.setOpaque( false );
        textArea.setText( "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor "
                + "invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo "
                + "duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor "
                + "sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor "
                + "invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et "
                + "justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum "
                + "dolor sit amet." );

        scrollPane = new JScrollPane();
//        scrollPane.setViewportView( textArea );
        scrollPane.setLocation( 50, 50 );
        scrollPane.setSize( 200, 200 );

        frame = new JFrame( getClass().getSimpleName() );
        frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
        frame.setLayout( null );
        frame.setSize( 340, 380 );
        frame.setLocationRelativeTo( null );

        frame.add( scrollPane );



        JViewport viewport = new JViewport()
        {
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);

                g.setColor( Color.BLUE );
                g.drawArc( 100, 100, 80, 80, 0, 360);
            }
        };

        textArea.setOpaque( false );
        viewport.setView(textArea);
        scrollPane.setViewport( viewport );
    }
}

否则,我认为您需要使用JLayer类。有关示例,请参阅关于如何用JLayer类装饰组件的Swing教程中的部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24975898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档