Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 jScrollPane可以';不添加组件_Java_Swing_Layout Manager_Jcomponent - Fatal编程技术网

Java jScrollPane可以';不添加组件

Java jScrollPane可以';不添加组件,java,swing,layout-manager,jcomponent,Java,Swing,Layout Manager,Jcomponent,我在表单上有一个jScrollPane和一个按钮。该按钮将组件添加到jScrollPane。我正在使用带有中心对齐的FlowLayout在jScrollPane中排列组件 第一个组件没有出现问题,并且完全对齐。当我再次按下按钮时,似乎什么也没有发生。当我跟随调试器时,它显示所有事情都像以前一样发生 单击按钮时正在执行的代码: jScrollPane.getViewport().add(new Component()); 这就是我如何在jScrollPane的视口上设置FlowLayout: j

我在表单上有一个
jScrollPane
和一个按钮。该按钮将组件添加到
jScrollPane
。我正在使用带有中心对齐的
FlowLayout
jScrollPane
中排列组件

第一个组件没有出现问题,并且完全对齐。当我再次按下按钮时,似乎什么也没有发生。当我跟随调试器时,它显示所有事情都像以前一样发生

单击按钮时正在执行的代码:

jScrollPane.getViewport().add(new Component());
这就是我如何在
jScrollPane
视口上设置
FlowLayout

jScrollPane.getViewport().setLayout(new FlowLayout(FlowLayout.CENTER));

你把重量级(AWT)和轻量级(Swing)混合在一起,这是不可取的,因为它们在一起打得不好

JScrollPane
包含一个
JViewPort
,您可以在其上添加一个子组件,即视图

(图片来源于

因此调用
jScrollPane.getViewport().setLayout(新的FlowLayout(FlowLayout.CENTER))
实际上是在设置
JViewPort
的布局管理器,这是不可取的

您应该做的是创建要添加到滚动窗格中的组件,设置其布局并将其所有子组件添加到滚动窗格中,然后将其添加到滚动窗格中。如果您愿意,您可以在稍后阶段将组件添加到“视图”,但这取决于您

// Declare "view" as a class variable...
view = new JPanel(); // FlowLayout is the default layout manager
// Add the components you need now to the "view"
JScrollPane scrollPane = new JScrollPane(view);
现在,您可以根据需要向视图中添加新组件

view.add(...);
如果不想维护对
视图的引用
,可以通过调用
JViewport#getView
来访问它,它将返回由视图端口管理的组件

JPanel view = (JPanel)scrollPane.getViewPort().getView();
工作示例

这对我来说很好

注意-我在我的代码中添加了
view.validate()
,在我添加了一个新组件之后,您可能还没有这个组件

public class TestScrollPane01 {

    public static void main(String[] args) {
        new TestScrollPane01();
    }

    public TestScrollPane01() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MainPane extends JPanel {

        private JScrollPane scrollPane;
        private int count;

        public MainPane() {
            setLayout(new BorderLayout());
            scrollPane = new JScrollPane(new JPanel());
            ((JPanel)scrollPane.getViewport().getView()).add(new JLabel("First"));
            add(scrollPane);

            JButton add = new JButton("Add");
            add.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JPanel view = ((JPanel)scrollPane.getViewport().getView());
                    view.add(new JLabel("Added " + (++count)));
                    view.validate();
                }
            });

            add(add, BorderLayout.SOUTH);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

1) “该按钮将一个组件添加到
jScrollPane
”a)它是
jScrollPane
(注意大写字母
J
)b)为什么在按钮上单击而不是在创建GUI时单击?在这里改变现有GUI的用例是什么?2) 在
jScrollPane.getViewport()上添加(新组件())没有正当理由,不要向Swing GUI添加基于AWT的组件。对于测试,添加一个“真实的”组件-默认的
JTree
附带一些数据。3) 为了更快地获得更好的帮助,请发布一条消息。我按照您的建议进行了设置。当我试着按下按钮时,什么也没发生。我用
JPanel
实例化
JScrollPane
,作为
视图
,并完全按照您的建议完成其余部分。按钮事件上的代码:((JPanel)JScrollPane.getViewport().getView()).add(newjcomponent())实例化代码:
JScrollPane=newjavax.swing.JScrollPane(newjpanel(newflowlayout(FlowLayout.CENTER))非常感谢!确实是
validate()
起了作用。只有一个问题,我看到当
视图上的组件超过
视图时,我无法滚动。我是否错误地设置了
JScrollPane
?您可以尝试重新验证而不是验证