![](/img/trans.png)
[英]Java Swing: Error when dynamically adding JScrollpane to JPanel
[英]java JPanel, dynamically adding components to it and JScrollPane
我们一直在尝试这种方法,但是没有运气,请注意,我可能以错误的方式使用了组件...我们有一个JFrame
包含一个JPanel
,其中包含一个JScrollPane
,其中包含另一个JPanel,称为interiorPanel
。 有了一个JButton
,它的动作可以动态地将组件添加到最里面的面板,然后调用其revalidate()
方法, interiorPanel
面板会像我们需要的那样在JScrollPane interiorPanel
增长,显示其滚动条如下:
但是,我们希望使用循环而不是使用按钮来添加组件。 使用此循环:
for (int i = 1; i < 10; i++) {
demo.getPanelInterior().add(new JButton("Hello"));
demo.getPanelInterior().revalidate();
demo.getPanelInterior().repaint();
}
由于最里面的面板变大了,所以似乎不像单击按钮时那样工作,但是滚动条没有显示出来,所以我们以这样的结尾:
我们应该怎么做才能从第一张图片中得到结果? 这是工作示例代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Demo extends JPanel {
private JPanel exteriorPanel;
private JPanel interiorPanel;
private JButton button;
private JList<String> list;
private String[] imageNames = { "Bird", "Cat", "Dog", "Rabbit", "Pig", "dukeWaveRed",
"kathyCosmo", "lainesTongue", "left", "middle", "right", "stickerface"};
private DefaultListModel<String> model;
public Demo() {
//Create the list of images and put it in a scroll pane.
model = new DefaultListModel<>();
for (String s : imageNames) {
model.addElement(s);
}
list = new JList<String>(model);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setSelectedIndex(0);
JScrollPane listScrollPane = new JScrollPane();
listScrollPane.setViewportView(list);
button = new JButton("Add element");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
buttonActionPerformed(e);
}
});
interiorPanel = new JPanel();
interiorPanel.add(listScrollPane);
interiorPanel.add(button);
interiorPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));
JScrollPane anotherScroll = new JScrollPane();
anotherScroll.setViewportView(interiorPanel);
exteriorPanel = new JPanel();
exteriorPanel.add(anotherScroll);
exteriorPanel.setPreferredSize(new Dimension(400, 200));
interiorPanel.setBackground(new Color(255, 0, 0));
}
private void buttonActionPerformed(ActionEvent e) {
model.addElement("Hola");
interiorPanel.add(new JButton("Hello"));
interiorPanel.revalidate();
}
//Used by SplitPaneDemo2
public JList getImageList() {
return list;
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Demo demo = new Demo();
frame.getContentPane().add(demo.getExteriorPanel());
//Display the window.
frame.pack();
frame.setVisible(true);
for (int i = 1; i < 10; i++) {
demo.getPanelInterior().add(new JButton("Hello"));
demo.getPanelInterior().revalidate();
demo.getPanelInterior().repaint();
}
}
public JPanel getExteriorPanel() {
return exteriorPanel;
}
public JPanel getPanelInterior() {
return interiorPanel;
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
提前致谢
(主要)问题与exteriorPanel
对FlowLayout
的使用有关,这使它可以扩展以满足JScrollPane
的要求, JScrollPane
会尝试使用其内容的首选大小作为自身布局计算的基础。 ...这会使您看到的结果更加复杂。 实际上,即使使用“单击按钮”,如果您尝试调整窗口的大小也会发生这种情况。
相反,请尝试更改exteriorPanel
面板的布局管理器,例如...
exteriorPanel = new JPanel(new BorderLayout());
这将强制滚动窗格满足父容器的要求,然后将允许视图溢出其边界并显示滚动条...
您还应该通读我是否应该避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.