【问题标题】:Painting problems with custom ScrollPane自定义 ScrollPane 的绘画问题
【发布时间】:2012-05-05 17:02:24
【问题描述】:

为了在我的其他问题中保持秩序,建议单独提出以下问题:

以下是测试类的代码,我在其中添加了我的自定义 JScrollBar

public class TestScrollBar {

    private static JFrame           f;
    private static Container        pane;
    private static JScrollPane      scroll1;
    private static JScrollBar       scrollbar;
    private static JPanel           panel;
    private static JList<String>    list1;

    public static void main(String[] arg){
        createBasic();
        createComponents();
        f.setVisible(true);
    }

    private static void createBasic(){
        f = new JFrame("ScrollbarTest");
        f.setBounds(100,100,300,300);

        pane = f.getContentPane();
        pane.setLayout(null);

        panel = new JPanel();
        panel.setBackground(Color.GREEN);
        panel.setLayout(null);
        panel.setBounds(50,50,200,150);
    }

    private static void createComponents(){

        String[] data = {"ggggg", "ggggg", "ggggg", "ggggg", "ggggg", "ggggg", "ggggg", "ggggg", "ggggg", "ggggg", "ggggg", "ggggg"};
        list1 = new JList<String>(data);
        list1.setBackground(new Color(0,0,0,0));

        scrollbar = new JScrollBar();
        CustomScrollBarUI ui = new CustomScrollBarUI();
        scrollbar.setUI(ui);
        scrollbar.setOpaque(false);

        scroll1 = new JScrollPane(list1);
        scroll1.setBounds(20,20,160,110);
        scroll1.setOpaque(false);
        scroll1.getViewport().setOpaque(false);
        scroll1.setVerticalScrollBar(scrollbar);

        panel.add(scroll1);
        pane.add(panel);
    }
}

自定义的 ScrollBarUI 可以看这里:Custom JScrollBar-Thumb is painted, but doesn't move 我唯一改变的(感谢mgarin)是 g.drawImage(img, thumbBounds.x, thumbBounds.y, new Color(255,255,255,0), null);

如果我移动拇指,会发生以下情况(请不要介意设计,这只是为了测试一些不透明的东西......)

http://tinypic.com/r/sz94pf/6

【问题讨论】:

  • 你能发布一个实际的问题吗?我在上面的原始帖子中没有看到,只是描述性的东西。另外,我在您的问题中添加了一个“java”标签。
  • 从图片上看,滚动容器并没有在滚动时更新,并且您会得到那些从之前的内容延伸出来的线条。您可能只需要在滚动结束时执行 SwingUtilities.updateComponentTreeUI(scroll1) 即可正确更新。

标签: java swing jscrollpane jlist jscrollbar


【解决方案1】:

您使列表的背景透明;

list1.setBackground(new Color(0,0,0,0));

如果你去掉那条线,它画得很好。

另外注意:如果你想给你的单元格一个自定义的背景颜色,尝试使用一个自定义的 ListCellRenderer,使用 JList 上的 setCellRenderer() 方法。然后您可以设置您返回的组件的背景颜色。

【讨论】:

  • 谢谢。实际上,我想让整个 JList 透明,因为我想看到 JList 添加到其上的 JPanel 的背景(在此测试用例中为 JPanel 面板)。所以你是说我应该创建一个自定义的“myCellRenderer”实现 ListCellRenderer?没有更简单的方法来设置 JList 的背景透明吗?
  • @ValentinoRu 没有。没有。使组件的背景透明并不是一件常见的事情。我做了一些实验,自定义列表单元格渲染器实际上也不起作用。我现在唯一能想到的就是自己实现一个类似 JList 的组件,在其中将每个列表项 (JPanel) 的背景设置为透明 alpha。
  • @ValentinoRu 以防万一;将列表添加到滚动窗格后,在 JList 上调用 setOpaque(false),使 JList 和 JList.getParent() 的背景都透明,并在返回之前将组件的背景设置为透明的单元格渲染器实际上使列表透明,但会弄乱选择颜色。我不想自己花更多时间在这上面,但这实际上可能会导致它实际上可以正常工作,而不必做太多“hacky”的事情。
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多