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
?您可以尝试重新验证而不是验证