繁体   English   中英

无法在Java Swing中调整JPanel的大小

[英]Unable to resize JPanel in java Swing

我刚刚开始使用Java Swing,并且正在阅读以下文章: java / swing形式的动态字段添加 我通过一些修改实现了本文中的代码,并且效果很好。 正如文章中提到的,当我们添加更多行时, JPanel不会自动调整大小。 有人可以通过易于理解的解释来更深入地了解这个问题吗,当我们按下+/-按钮时,如何调整JPanel大小? 这是代码:

行类

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class Row extends JPanel {

    private JTextField quantity;
    private JTextField item;
    private JTextField price;
    private JButton plus;
    private JButton minus;
    private RowList parent;

    public Row(String initialQuantity, String initalPrice, String initialItem, RowList list) {
        this.parent = list;
        this.plus = new JButton(new AddRowAction());
        this.minus = new JButton(new RemoveRowAction());
        this.quantity = new JTextField(10);
        this.item = new JTextField(10);
        this.price = new JTextField(10);
        this.quantity.setText(initialQuantity);
        this.price.setText(initalPrice);
        this.item.setText(initialItem);
        add(this.plus);
        add(this.minus);
        add(this.quantity);
        add(this.item);
        add(this.price);
    }

    public class AddRowAction extends AbstractAction {

        public AddRowAction() {
            super("+");
        }

        public void actionPerformed(ActionEvent e) {
            parent.cloneRow(Row.this);
        }
    }

    public class RemoveRowAction extends AbstractAction {

        public RemoveRowAction() {
            super("-");
        }

        public void actionPerformed(ActionEvent e) {
            parent.removeItem(Row.this);
        }
    }

    public void enableAdd(boolean enabled) {
        this.plus.setEnabled(enabled);
    }
    public void enableMinus(boolean enabled) {
        this.minus.setEnabled(enabled);
    }
}

RowList类

    import java.util.ArrayList;
    import java.util.List;

    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;

    @SuppressWarnings("serial")
    public class RowList extends JPanel{
        private List<Row> rows;

        public RowList() {
            this.rows = new ArrayList<Row>();
            Row initial = new Row("1","0.00","", this);
            //addHeaders();
            //addGenerateBillButton();
            addItem(initial);
        }

        public void addHeaders(){
            JLabel qty = new JLabel("Quantity");
            //qty.setBounds(10, 0, 80, 25);
            add(qty);
            JLabel item = new JLabel("Item");
            //item.setBounds(70, 0, 80, 25);
            add(item);
            JLabel price = new JLabel("Price");
            //price.setBounds(120, 0, 80, 25);
            add(price);
        }

        public void addGenerateBillButton(){
            JButton billGenerationButton = new JButton("Generate Bill");
            add(billGenerationButton);
        }

        public void cloneRow(Row row) {
            Row theClone = new Row("1","0.00","", this);
            addItem(theClone);
        }

        private void addItem(Row row) {
            rows.add(row);
            add(row);
            refresh();
        }

        public void removeItem(Row entry) {
            rows.remove(entry);
            remove(entry);
            refresh();
        }

        private void refresh() {
            revalidate();
            repaint();
            if (rows.size() == 1) {
                rows.get(0).enableMinus(false);
            }
            else {
                for (Row e : rows) {
                    e.enableMinus(true);
                }
            }
        }
    }

主班

import javax.swing.JFrame;

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Enter Items");
        RowList panel = new RowList();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
 }

您可以再次调用框架的pack()

试试这个:在您的Row类中添加它

    public class AddRowAction extends AbstractAction
    {

        public AddRowAction()
        {
            super("+");
        }

        public void actionPerformed(ActionEvent e)
        {
            parent.cloneRow(Row.this);

            ((JFrame) SwingUtilities.getRoot(parent)).pack(); // <--- THIS LINE
        }
    }

    public class RemoveRowAction extends AbstractAction
    {

        public RemoveRowAction()
        {
            super("-");
        }

        public void actionPerformed(ActionEvent e)
        {
            parent.removeItem(Row.this);

            ((JFrame) SwingUtilities.getRoot(parent)).pack(); // <--- THIS LINE
        }
    }

您可以使用SwingUtilities.getRoot(comp)child组件获取根组件(JFrame),然后在将新Row添加到RowList之后调用pack()方法。

这将调整您的JPanel的大小。 但是您的RowList将是水平的。 这是LayoutManager发挥作用的地方。

您可以在此处了解更多有关不同LayoutManagers 信息

要解决此问题,在您的RowList面板,设置您的布局:

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

在您的刷新方法中,在revalidate()之后调用doLayout()方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM