gpt4 book ai didi

java - 将 JPanel 动态添加到 JScrollPane

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:55 27 4
gpt4 key购买 nike

我有一个如下所示的 GUI: GUI当我按下按钮 addComponent 时,新的 JPanels 添加到 scrollPane(1),添加了 JPanels 但滚动 Pane 没有滚动,发生的事情是它添加了新的 JPanels 并且 jPanels 的大小正在减小。

因此我的问题是面板被插入到 JScrollPane 中并且这些面板的大小正在减小但是没有滚动条。

这是我到目前为止的代码:

    public class ContractForm extends JFrame {

private JPanel contentPane;
private JTextField txtContractID;
private JScrollPane scrollPane;
private JButton btnAddComponent;
private JButton btnOk;
private JComboBox<Customer> comboBoxCustomer;
private JButton btnCancel;
private ArrayList<JPanel> rows;
private JPanel panel;
private Dimension size;


/**
* Create the frame.
*/
public ContractForm() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(250, 250, 654, 476);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

rows = new ArrayList<JPanel>();

JLabel lblContractid = new JLabel("ContractID");
lblContractid.setBounds(50, 11, 78, 14);
contentPane.add(lblContractid);

txtContractID = new JTextField();
txtContractID.setBounds(138, 8, 86, 20);
contentPane.add(txtContractID);
txtContractID.setColumns(10);

JLabel lblNewLabel = new JLabel("Customer");
lblNewLabel.setBounds(276, 11, 69, 14);
contentPane.add(lblNewLabel);

comboBoxCustomer = new JComboBox<Customer>();
comboBoxCustomer.setBounds(355, 8, 235, 20);
contentPane.add(comboBoxCustomer);

JLabel lblYear = new JLabel("Year:");
lblYear.setBounds(50, 37, 46, 14);
contentPane.add(lblYear);

JSpinner spinner = new JSpinner();
spinner.setBounds(138, 31, 86, 20);
contentPane.add(spinner);

scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setBounds(0, 59, 628, 312);
contentPane.add(scrollPane);

panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
size = panel.getSize();
scrollPane.setViewportView(panel);


btnAddComponent = new JButton("addComponent");
btnAddComponent.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
ArrayList<JobDescription> jobs = Database.getInstance().getJobDescription();
JobDescriptionContractRow row = new JobDescriptionContractRow(jobs);
rows.add(row);
panel.add(row);
scrollPane.repaint();
scrollPane.revalidate();

}
});
btnAddComponent.setBounds(355, 30, 114, 23);
contentPane.add(btnAddComponent);

btnOk = new JButton("Ok");
btnOk.setBounds(185, 382, 89, 23);
contentPane.add(btnOk);

btnCancel = new JButton("Cancel");
btnCancel.setBounds(298, 382, 89, 23);
contentPane.add(btnCancel);




}
}

public class JobDescriptionContractRow extends JPanel {
private JTextField textField;
private JButton btnRemove;

/**
* Create the panel.
*/
public JobDescriptionContractRow(ArrayList<JobDescription> jobs) {
setLayout(null);

JLabel lblJobdescription = new JLabel("Job description");
lblJobdescription.setBounds(10, 14, 94, 14);
add(lblJobdescription);

JComboBox<JobDescription> comboBox = new JComboBox<JobDescription>();
comboBox.setBounds(102, 11, 149, 20);
for(JobDescription job : jobs){
comboBox.addItem(job);
}
comboBox.setSelectedItem(null);
add(comboBox);

textField = new JTextField();
textField.setBounds(365, 11, 86, 20);
add(textField);
textField.setColumns(10);

JLabel lblNewLabel = new JLabel("Contract price");
lblNewLabel.setBounds(277, 14, 78, 14);
add(lblNewLabel);

JButton btnRemove = new JButton("remove");
btnRemove.setBounds(469, 10, 89, 23);
add(btnRemove);


}
}

最佳答案

JPanel(您的 JScrollPane View 组件)默认使用 FlowLayout,它尊重组件的首选大小。您可以覆盖 getPreferredSize添加的 JPanels 以正确调整它们的大小。如果不这样做,JScrollPane 会计算所有尺寸以适应 ViewPortView

旁注:避免使用绝对定位(null 布局)并使用 layout manager .

关于java - 将 JPanel 动态添加到 JScrollPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15785188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com