【问题标题】:DesignGridLayout goes out of boundariesDesignGridLayout 越界
【发布时间】:2014-05-31 15:23:16
【问题描述】:

我的问题是生成 Swing GUI 的代码超出了笔记本电脑的显示范围。为什么? 它使用 DesignGridLayout 作为布局库。

这是取自答案的代码:Why does my components go out of boundaries, please help me to align it with the necessary code

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import net.java.dev.designgridlayout.DesignGridLayout;

public class Demo {

    private void createAndShowGUI() {

        JLabel i5l1 = new JLabel("FREIGHT DETAILS");
        JLabel i5l2 = new JLabel("Date : ");
        JLabel i5l3 = new JLabel("Vehicle No. : ");
        JLabel i5l4 = new JLabel("From : ");
        JLabel i5l5 = new JLabel("Item : ");
        JLabel i5l6 = new JLabel("Quantity : ");
        JLabel i5l7 = new JLabel("Kg.");
        JLabel i5l8 = new JLabel("Rate :                                          Rs.");
        JLabel i5l15 = new JLabel("SALE DETAILS");
        JLabel i5l16 = new JLabel("Cash Sales :                             Rs. ");
        JLabel i5l17 = new JLabel("Credit :                                       Rs. ");
        JLabel i5l18 = new JLabel("EXPENSES");
        JLabel i5l19 = new JLabel("Food & Tea :                            Rs. ");
        JLabel i5l20 = new JLabel("Wages :                                   Rs. ");
        JLabel i5l21 = new JLabel("Miscellaneous Expenses :     Rs. ");

        JTextField i5t1 = new JTextField(20);
        JTextField i5t2 = new JTextField(20);
        JTextField i5t3 = new JTextField(20);
        JTextField i5t4 = new JTextField(20);
        JTextField i5t11 = new JTextField(20);
        JTextField i5t12 = new JTextField(20);
        JTextField i5t13 = new JTextField(20);
        JTextField i5t14 = new JTextField(20);

        JComboBox i5cb1 = new JComboBox<>();
        JComboBox i5cb2 = new JComboBox<>();
        JComboBox i5cb3 = new JComboBox<>();

        JButton i5b1 = new JButton("Save");
        JButton i5b2 = new JButton("Reset"); 
        JButton i5b3 = new JButton("Close");

        JSeparator i5sep1 = new JSeparator();
        JSeparator i5sep2 = new JSeparator();
        JSeparator i5sep3 = new JSeparator();
        JSeparator i5sep4 = new JSeparator();
        JSeparator i5sep5 = new JSeparator();
        JSeparator i5sep6 = new JSeparator();

        Object[] columnNames = new Object[]{"Column # 1", "Column # 2", "Column # 3", "Column # 4"};
        DefaultTableModel model = new DefaultTableModel(columnNames, 10);
        JTable table = new JTable(model);

        JScrollPane i5t1sp1 = new JScrollPane(table);

        JPanel freightPanel = new JPanel();
        DesignGridLayout layout1 = new DesignGridLayout(freightPanel);

        layout1.row().left().add(i5sep1).fill().withOwnRowWidth();
        layout1.row().center().add(i5l1);
        layout1.row().left().add(i5sep2).fill().withOwnRowWidth();
        layout1.row().grid(i5l2).add(i5t1);
        layout1.row().grid(i5l3).add(i5t2);
        layout1.row().grid(i5l4).add(i5cb1);
        layout1.row().grid(i5l5).add(i5cb2);
        layout1.row().grid(i5l6).add(i5t3).add(i5l7);
        layout1.row().grid(i5l8).add(i5t4);

        layout1.row().left().add(i5sep5).fill().withOwnRowWidth();
        layout1.row().center().add(i5l18);
        layout1.row().left().add(i5sep6).fill().withOwnRowWidth();
        layout1.row().grid(i5l19).add(i5t12);
        layout1.row().grid(i5l20).add(i5t13);
        layout1.row().grid(i5l21).add(i5t14);

        JPanel salePanel = new JPanel();
        DesignGridLayout layout2 = new DesignGridLayout(salePanel);

        layout2.row().left().add(i5sep3).fill().withOwnRowWidth();
        layout2.row().center().add(i5l15);
        layout2.row().left().add(i5sep4).fill().withOwnRowWidth();
        layout2.row().grid(i5l16).add(i5t11);
        layout2.row().grid(i5l17).add(i5cb3);
        layout2.row().grid().add(i5t1sp1);

        JInternalFrame internalFrame = new JInternalFrame("Daily Analysis",true,true, true, true);        

        DesignGridLayout mainLayout = new DesignGridLayout(internalFrame.getContentPane());
        mainLayout.row().grid().add(freightPanel).add(salePanel);
        mainLayout.row().left().add(new JSeparator()).fill().withOwnRowWidth();
        mainLayout.row().center().add(i5b1).add(i5b2).add(i5b3);

        internalFrame.pack();
        internalFrame.setVisible(true);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(internalFrame);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Demo().createAndShowGUI();
            }
        });
    }
}

【问题讨论】:

    标签: java swing user-interface layout layout-manager


    【解决方案1】:

    好吧,为什么不呢?

    pack() 使框架具有正确显示其所有子组件所需的大小(根据其首选大小并满足最小/最大限制),如果它们有很多要显示的内容和/或您的分辨率不够大窗口可能最终会超出您的屏幕范围。如果框架被最大化,这将是一个令人惊讶的问题。

    【讨论】:

    • 天气代码中是否存在 pack(),GUI 超出范围。为什么这些组件占用这么多空间?
    • @user3422747 对我来说,没有两个(!)包的框架大小为 0。但是,核心“问题”是组件需要占用大量空间。为什么这取决于组件的性质和LayoutManager (DesignGridLayout)。例如,尝试在 mainLayout 上添加添加来禁用前 2 行,这样您就只有 mainLayout.row().center().add(i5b1).add(i5b2).add(i5b3); 您可以看到现在框​​架很小,因为这是按钮要求的空间。
    • 是的,确实,如果我删除了添加的主面板的前 2 行,那么它仍然只添加了按钮,并且面板非常小。其实我想知道,为什么那些其他组件占用这么多空间,例如文本字段?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2013-10-21
    • 2012-10-28
    • 2013-12-15
    • 2017-09-30
    • 1970-01-01
    相关资源
    最近更新 更多