簡體   English   中英

如何在Java中動態設置對象?

[英]How to dynamically set an object in java?

我正在用Java創建一個GUI應用程序,該應用程序使用來自用戶的輸入並使用默認名稱(如jTextField1,jTextField2等)動態設置jFrame中的文本字段。

我的項目演示如下:

在此處輸入圖片說明

1)它接受組合框中的行數和列數。

2)應根據用戶選擇設置列數和行數。 (即它應該在JFrame上動態創建Jtextfield對象)

我可以在循環語句中動態設置這些命令並創建所需的文本字段數量嗎?

     private void initComponents() {
    jTextField1 = new javax.swing.JTextField();
            jTextField2 = new javax.swing.JTextField();
}


private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;

還是有其他方法可以做到這一點。

是否可以使用其他任何語言(例如javascript或html)。

任何幫助表示贊賞!

您的方法是正確的。 您遍歷索引並創建新組件(Java GUI對象)並將其添加到容器中。

記住要檢查現有組件或remove()/removeAll()它們。

更新:創建容器時,通常會定義一個LayoutManager(我對GridBagLayout更為熟悉,但是XYLayout對您很有用)。 將組件添加到容器時,您可以使用一種方法,該方法允許額外的對象constraints 該對象將傳遞給layoutManager,以了解在何處/如何繪制添加的組件。

當然,每個不同的layoutManager使用其自己的不同約束,因此對於GridBagLayout我傳遞了GridBagConstraints對象。 在您的示例中,要構建一行,將使用默認的GridBagConstraints添加除字段之外的所有其他字段; 最后一行中的GridBagConstraints將具有

 GridBagConstraints.gridwidth = GridBagConstraints.REMAINDER;

通知布局管理器它是該行的最后一項。

您應該閱讀有關布局管理器的信息。 在您的情況下,您應該從使用GridLayout開始。 讀取行數和列數,使用適當的參數創建GridLayout。 然后在for循環中創建文本字段(或2個嵌套的for循環)並將其添加到面板中。

您將看到文本字段的數量及其位置幾乎可以。 現在看到問題:文本字段的大小將取決於您的框架大小。 要解決此問題,您可以將BoxLayoutGridBagLayout替換為GridLayout ,或者將嵌套面板與流布局一起使用,或者使用第三方工具(例如MigLayout

首先:您可以將數組用於文本字段:

JTextField[][] matrix1TextFields, matrix2TextFields, matrix3TextFields;
private void refreshMatrixComponents(int r, int c) {
  matrix1TextFields = new JTextField[r][c];
  matrix2TextFields = new JTextField[r][c];
  matrix3TextFields = new JTextField[r][c];
  for (int row = 0; row < r; row++) {
    for (int col = 0; col < c; col++) {
      matrix1TextFields[row][col] = new JTextField();
      matrix2TextFields[row][col] = new JTextField();
      matrix3TextFields[row][col] = new JTextField();
    }
  }
  placeMatrixTextField();  
}

對於布局管理器,有很多選擇。 我會推薦GridLayout (非常易於使用)或GridBagLayout (更難使用,但更靈活),或者像MigLayout這樣的MigLayout (您將不得不深入語法,但我認為這完全值得付出努力) 。 我還建議為每個矩陣創建一個JPanel並將所有文本字段放在其中。 然后放置那些JPanels +其余組件:

JPanel matrix1Panel, matrix2Panel, matrix3Panel;
private void placeMatrixTextField() {
  int r = matrix1TextFields.length, c = matrixTextFields[0].length;
  matrix1Panel = new JPanel();
  matrix2Panel = new JPanel();
  matrix3Panel = new JPanel();
  matrix1Panel.setLayout(new GridLayout(r, c));
  matrix2Panel.setLayout(new GridLayout(r, c));
  matrix3Panel.setLayout(new GridLayout(r, c));
  for (int row = 0; row < r; row++) {
    for (int col = 0; col < c; col++) {
      matrix1Panel.add(matrix1TextFields[row][col]);
      matrix2Panel.add(matrix2TextFields[row][col]);
      matrix3Panel.add(matrix3TextFields[row][col]);
    }
  }
  // now place your panels
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM