2012-05-05 87 views
2

维持秩序,我的其他问题绘画的问题,有人建议要问seperately如下:定制的ScrollPane

以下是测试类的代码,我在其中添加我的自定义的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);

和下面的情况发生,如果我移动日UMB(请不要介意设计,它只是为了测试一些不透明的东西...)

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

+1

你能发表一个实际的问题吗?我在上面的原文中没有看到一个,只是描述性的东西。另外,我为您的问题添加了一个“java”标记。 –

+0

从图片判断,滚动容器在滚动时不会更新,并且会从前面的内容中获得这些线条。您可能只需在滚动结束时执行'SwingUtilities.updateComponentTreeUI(scroll1)'操作,以便正确更新。 – Ozzy

回答

2

您的上榜透明的背景;

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

如果您删除该线条,它会很好。

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

+0

谢谢。实际上,我希望整个JList都是透明的,因为我想看看添加了Jlist的JPanel的背景(在这个测试用例中是JPanel面板)。所以你说我应该创建一个自定义的“myCellRenderer”来实现ListCellRenderer?有没有更简单的方法来设置JList的背景透明? –

+0

@ValentinoRu号没有。使组件的背景透明并不是一件普通的事情。我做了一些实验,并且自定义列表单元格渲染器实际上也不起作用。现在我唯一能想到的就是自己实现一个类似JList的组件,在其中将每个列表项(JPanel)的背景设​​置为透明的alpha。 – Bartvbl

+0

@ValentinoRu万一重要,将列表添加到滚动窗格后,在JList上调用setOpaque(false),使JList和JList.getParent()的背景透明,并在返回之前创建一个单元渲染器,以将组件的背景设置为透明实际上使列表透明,但会弄乱选择颜色。我不想花更多时间在自己身上,但这可能实际上是实现它的工作而不必做太多'哈克'的东西。 – Bartvbl