主頁 > 軟體設計 > javaGridBagLayout中定位組件

javaGridBagLayout中定位組件

2021-12-03 17:36:26 軟體設計

我對 Java 比較陌生,我正在制作一個可以幫助我估算構建成本的應用程式。我為它構建了后端,但按鈕和文本欄位都在一行中,使應用程式太寬以至于無法適應我的螢屏。我現在嘗試使用 3x6 網格包布局來組織這樣的組件:

      Title
question1  *answer*
question2  *answer*
question3  *answer*
question4  *answer*
  --Calculate--
Estimate:    $***

當我運行程式時,我得到了一個“非法組件位置”錯誤(粘貼在底部),自從我開始添加網格約束以來,沒有任何東西彈出。問題不在于 JButton 或其動作偵聽器。這是代碼,抱歉缺少注釋:

import java.util.*;
import packagepackage.HintTextFieldUI; 
import java.awt.*;
import java.awt.event.*;
import java.security.PublicKey;

import javax.swing.*;
import javax.swing.text.JTextComponent;
public class CP_GUI extends JFrame {
    
    public JLabel tLabel;
    
    public JTextField linear; 
    public JLabel liLabel;
    
   public JComboBox<String> sump; 
   public JLabel suLabel;
   
   public JComboBox<String> elec; 
   public JLabel elLabel;
   
    public JTextField prep;
    public JLabel prLabel;
    
   public JTextField estimate;
   public JLabel esLabel;
   
     public CP_GUI() { 
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(200, 200, 100, 100));
        GridBagConstraints c = new GridBagConstraints();
        
        String title = "Drain Tile Calculator";
        tLabel = new JLabel(title);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.ipady = 40;
        c.gridwidth = 3;
        c.gridx = 0;
        c.gridy = 0;
        panel.add(tLabel, c);
        frame.setTitle(title);

        liLabel = new JLabel("Basement Perimeter Length");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 1;
        c.gridy = 0;
        panel.add(liLabel, c);
        linear = new JTextField(10);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 1;
        c.gridy = 0;
        panel.add(linear, c);
        
        prLabel = new JLabel("Time needed to prepare site:");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 2;
        c.gridy = 0;
        panel.add(prLabel, c);
        prep = new JTextField(10);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 2;
        c.gridy = 2;
        panel.add(prep, c);
        
        suLabel = new JLabel("Using:");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 3;
        c.gridy = 0;
        panel.add(suLabel, c);
        String[] sumpo = {"New sump pump","Existing sump pump"};
        sump = new JComboBox<>(sumpo);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 3;
        c.gridy = 2;
        panel.add(sump, c);
        
        elLabel = new JLabel("Location of electrical outlet:");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 4;
        c.gridy = 0;
        panel.add(elLabel, c);
        String[] electo = {"There is no outlet within 6 feet of the sump pump","There is an outlet nearby, or I do not need a new pump"};
        elec = new JComboBox<>(electo);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 4;
        c.gridy = 2;
        panel.add(elec, c);
      
        estimate = new JTextField(10);
        
        JButton calculate = new JButton("Calculate");
        calculate.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event){
                // TODO Auto-generated method stub
                Integer linVar = Integer.parseInt(linear.getText());
                linVar *= 13;
                
                Object sumps = sump.getSelectedItem();
                Integer sumpVar = 0;
                if("New sump pump".equals(sumps)) {
                    sumpVar  = 260;}
                
                Object elecs = elec.getSelectedItem();
                Integer elecsVar = 0;
                if("There is no outlet within 6 feet of the sump pump".equals(elecs)) {
                    elecsVar  = 280;}
                
                Integer prepsVar = Integer.parseInt(prep.getText());
                prepsVar  = 30;
                prepsVar *= 235;
                prepsVar /= 100;
                
                linVar  = sumpVar  = elecsVar  = prepsVar;
                /* overhead*/
                linVar  = 2428;
                /* tax */
                linVar *= 11;
                linVar /= 10;
                /* margin */
                linVar *= 12;
                linVar /= 10;
                String toWords = String.valueOf(linVar);
                 
                    estimate.setUI(new HintTextFieldUI(toWords, true));
                    }

        });
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipady = 40;
        c.weightx = 0.5;
        c.gridwidth = 3;
        c.gridx = 5;
        c.gridy = 0;
        panel.add(calculate, c);
        
        esLabel = new JLabel("Estimated Cost:");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridwidth = 2;
        c.gridx = 6;
        c.gridy = 0;
        panel.add(esLabel, c);   
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 6;
        c.gridy = 2;
        panel.add(estimate, c); 
        

        frame.add(panel, GridBagConstraints.CENTER);
        
        frame.pack();
        frame.setVisible(true);
        
        linear.setUI(new HintTextFieldUI("Perimeter length", true));
        prep.setUI(new HintTextFieldUI("Minutes of preptime", true));
     }

    public static void main(String[] args) {
       new CP_GUI();
    }        
}

我懷疑這個問題可能與網格本身的大小 (3x6) 從未定義過的事實有關,或者與框架的布局沒有正確設定為網格包布局有關。

錯誤:

Exception in thread "main" java.lang.IllegalArgumentException: illegal component position
    at java.desktop/java.awt.Container.addImpl(Container.java:1115)
    at java.desktop/java.awt.Container.add(Container.java:1033)
    at java.desktop/javax.swing.JFrame.addImpl(JFrame.java:554)
    at java.desktop/java.awt.Container.add(Container.java:493)
    at craftsmanPeak/packagepackage.CP_GUI.<init>(CP_GUI.java:163)
    at craftsmanPeak/packagepackage.CP_GUI.main(CP_GUI.java:173)

非常感謝!對此,我真的非常感激!

uj5u.com熱心網友回復:

frame.add(panel, GridBagConstraints.CENTER); JFrameBorderLayout默認使用 a ,去掉GridBagConstraints.CENTER

我也清理了你的布局(相信我(網上有陌生人說??),那是一團糟)

你搞亂你xy職位

java GridBagLayout中定位組件

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public JLabel tLabel;

        public JTextField linear;
        public JLabel liLabel;

        public JComboBox<String> sump;
        public JLabel suLabel;

        public JComboBox<String> elec;
        public JLabel elLabel;

        public JTextField prep;
        public JLabel prLabel;

        public JTextField estimate;
        public JLabel esLabel;

        public TestPane() {
            setLayout(new GridBagLayout());
            setBorder(BorderFactory.createEmptyBorder(16, 16, 16, 16));
            GridBagConstraints c = new GridBagConstraints();

            String title = "Drain Tile Calculator";
            tLabel = new JLabel(title, JLabel.CENTER);
            c.fill = GridBagConstraints.HORIZONTAL;
            c.weightx = 0.5;
            c.ipady = 40;
            c.gridwidth = GridBagConstraints.REMAINDER;
            c.anchor = GridBagConstraints.CENTER;
            c.gridx = 0;
            c.gridy = 0;
            add(tLabel, c);

            c = new GridBagConstraints();
            c.anchor = GridBagConstraints.LINE_END;
            c.gridy = 1;
            c.gridx = 0;

            liLabel = new JLabel("Basement Perimeter Length:");
            prLabel = new JLabel("Time needed to prepare site:");
            suLabel = new JLabel("Using:");
            elLabel = new JLabel("Location of electrical outlet:");

            add(liLabel, c);
            c.gridy  ;
            add(prLabel, c);
            c.gridy  ;
            add(suLabel, c);
            c.gridy  ;
            add(elLabel, c);

            linear = new JTextField(10);
            prep = new JTextField(10);
            String[] sumpo = {"New sump pump", "Existing sump pump"};
            sump = new JComboBox<>(sumpo);
            String[] electo = {"There is no outlet within 6 feet of the sump pump", "There is an outlet nearby, or I do not need a new pump"};
            elec = new JComboBox<>(electo);

            c.anchor = GridBagConstraints.LINE_START;

            c.gridx  ;
            c.gridy = 1;
            add(linear, c);
            c.gridy  ;
            add(prep, c);
            c.gridy  ;
            add(sump, c);
            c.gridy  ;
            add(elec, c);

            JButton calculate = new JButton("Calculate");
////            calculate.addActionListener(new ActionListener() {
////                public void actionPerformed(ActionEvent event) {
////                    // TODO Auto-generated method stub
////                    Integer linVar = Integer.parseInt(linear.getText());
////                    linVar *= 13;
////
////                    Object sumps = sump.getSelectedItem();
////                    Integer sumpVar = 0;
////                    if ("New sump pump".equals(sumps)) {
////                        sumpVar  = 260;
////                    }
////
////                    Object elecs = elec.getSelectedItem();
////                    Integer elecsVar = 0;
////                    if ("There is no outlet within 6 feet of the sump pump".equals(elecs)) {
////                        elecsVar  = 280;
////                    }
////
////                    Integer prepsVar = Integer.parseInt(prep.getText());
////                    prepsVar  = 30;
////                    prepsVar *= 235;
////                    prepsVar /= 100;
////
////                    linVar  = sumpVar  = elecsVar  = prepsVar;
////                    /* overhead*/
////                    linVar  = 2428;
////                    /* tax */
////                    linVar *= 11;
////                    linVar /= 10;
////                    /* margin */
////                    linVar *= 12;
////                    linVar /= 10;
////                    String toWords = String.valueOf(linVar);
////
////                    estimate.setUI(new HintTextFieldUI(toWords, true));
////                }
////
////            });

            c = new GridBagConstraints();
            c.fill = GridBagConstraints.HORIZONTAL;
            c.insets = new Insets(10, 0, 10, 0);
            c.gridwidth = GridBagConstraints.REMAINDER;
            c.gridx = 0;
            c.gridy = 5;
            add(calculate, c);

            c = new GridBagConstraints();
            c.gridx = 0;
            c.gridy = 6;
            c.anchor = GridBagConstraints.LINE_END;

            esLabel = new JLabel("Estimated Cost:");
            estimate = new JTextField(10);

            add(esLabel, c);

            c.fill = GridBagConstraints.HORIZONTAL;
            c.gridx = 1;
            add(estimate, c);
//            linear.setUI(new HintTextFieldUI("Perimeter length", true));
//            prep.setUI(new HintTextFieldUI("Minutes of preptime", true));
        }
    }
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372473.html

標籤:爪哇 摇摆 布局管理器 网格布局 非法参数异常

上一篇:在JTable上顯示輸入

下一篇:通過單擊更改繪圖的顏色AWTJAVA

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more