Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义滚动窗格的绘制问题_Java_Swing_Jscrollpane_Jlist_Jscrollbar - Fatal编程技术网

Java 自定义滚动窗格的绘制问题

Java 自定义滚动窗格的绘制问题,java,swing,jscrollpane,jlist,jscrollbar,Java,Swing,Jscrollpane,Jlist,Jscrollbar,为了在我的另一个问题中保持秩序,建议分别提出以下问题: 下面是测试类的代码,我在其中添加了自定义JScrollBar public class TestScrollBar { private static JFrame f; private static Container pane; private static JScrollPane scroll1; private static JScrollBar

为了在我的另一个问题中保持秩序,建议分别提出以下问题:

下面是测试类的代码,我在其中添加了自定义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);
    }
}
公共类TestScrollBar{
私有静态jf帧;
专用静态容器窗格;
私有静态JScrollPane scroll1;
私有静态JScrollBar滚动条;
专用静态JPanel面板;
私有静态JList列表1;
公共静态void main(字符串[]arg){
createBasic();
createComponents();
f、 setVisible(真);
}
私有静态void createBasic(){
f=新JFrame(“ScrollbarTest”);
f、 立根(100300300);
pane=f.getContentPane();
pane.setLayout(空);
panel=新的JPanel();
面板.立根背景(颜色.绿色);
panel.setLayout(空);
面板立根(50,50200150);
}
私有静态void createComponents(){
字符串[]数据={“ggggg”、“ggggg”、“ggggg”、“ggggg”、“ggggg”、“ggggg”、“ggggggg”、“ggggggg”、“ggggg”、“ggggg”、“ggggggg”、“ggggggg”};
列表1=新的JList(数据);
列表1.挫折背景(新颜色(0,0,0,0));
scrollbar=新的JScrollBar();
CustomScrollBarUI=新的CustomScrollBarUI();
scrollbar.setUI(用户界面);
scrollbar.set不透明(false);
scroll1=新的JScrollPane(列表1);
卷轴1.立根(20,20160110);
滚动1.设置不透明(假);
scroll1.getViewport().setOpaque(false);
scroll1.设置垂直滚动条(滚动条);
面板。添加(滚动1);
窗格。添加(面板);
}
}
可以在此处看到自定义ScrollBarUI: 我唯一的改变(多亏了姆加林)是
g.drawImage(img,thumbBounds.x,thumbBounds.y,新颜色(255255,0),空)

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


您使列表的背景透明

list1.setBackground(new Color(0,0,0,0));
如果你去掉那条线,它画得很好


另请注意:如果要为单元格提供自定义背景颜色,请尝试使用自定义ListCellRenderer,使用JList上的setCellRenderer()方法。然后,您可以设置返回组件的背景颜色。

您可以发布实际问题吗?我在上面的原始帖子中没有看到,只是一些描述性的东西。另外,我在您的问题中添加了一个“java”标记。从图片上可以看出,滚动时滚动容器没有更新,而且这些行是从以前的内容延伸而来的。您可能只需要在滚动结束时执行
SwingUtilities.updateComponentTreeUI(scroll1)
,这样它就能正确更新。谢谢。事实上,我希望整个JList是透明的,因为我希望看到添加JList的JPanel的背景(在这个测试用例中,是JPanel面板)。你是说我应该创建一个自定义的“myCellRenderer”实现ListCellRenderer?没有更简单的方法来设置JList透明的背景吗?@ValentinoRu没有。没有。使组件的背景透明并不常见。我做了一些实验,自定义列表单元格渲染器实际上也不起作用。我现在唯一能想到的就是自己实现一个类似JList的组件,在这个组件中,您可以将每个列表项(JPanel)的背景设置为透明的alpha。@ValentinoRu,以防万一;将列表添加到滚动窗格后,在JList上调用setOpaque(false),使JList和JList.getParent()的背景都透明,并使单元渲染器在返回之前将组件的背景设置为透明,实际上使列表透明,但会弄乱选择颜色。我不想自己花更多的时间在它上面,但这实际上可能是一个让它在不需要做太多“黑客”工作的情况下真正工作的机会。