2017-01-29 13 views
-1

setHorizontalGroup()setVerticalGroup()が呼び出された後で、レイアウトをリセットせずにGroupLayoutのグループに動的にComponentを追加できますか?私は、GUIを使って、毎週のクラススケジュールをまとめる最良の方法を見つけるのに役立つプロジェクトに取り組んでいます。これは、未知数のクラスについて、クラス時間等に関する情報を入力することを含む。もちろん、ユーザーに情報を入力するためのフォームを任意の数だけ任意に追加することはできません。「誰もこの数のクラス以上のものを検討することはできません」と言うと、ユーザーは新しいフォームを追加する必要があります。彼ら自身。フォームを作成することはできますが、setHorizontalGroup(...)またはsetVerticalGroup(...)を再呼び出しすることなく、ウィンドウ内のGroupLayoutに追加する方法が見つかりません。これは、前のGroupを追加するのではなく、上書きします。 これは私が現在、(読みやすさのためにコメントし)したコードの関連部分である:コンポーネントをGroupLayout内のグループに動的に追加できますか?

private static void createAndShowGUI() { 
    //Create window and assign an empty GroupLayout to it 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    GroupLayout layout = new GroupLayout(frame.getContentPane()); 
    frame.getContentPane().setLayout(layout); 

    /*WeekPanel extends JPanel, and is the "form" the user enters data into. 
    In essence, it's a JPanel with a series of JTextFields.*/ 
    WeekPanel panel1 = new WeekPanel(); 
    WeekPanel panel2 = new WeekPanel(); 

    //The layout code below places two WeekPanels in the window, one on top of the other 
    layout.setHorizontalGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup() 
        .addComponent(panel1) 
        .addComponent(panel2))); 
    layout.setVerticalGroup(layout.createSequentialGroup() 
      .addComponent(panel1) 
      .addComponent(panel2)); 

    /*I would like to add a component to the layout here as proof of concept.*/ 
    frame.pack(); 
    frame.setVisible(true); 
} 

私はちょうどframe.pack()frame.add([some component])を呼び出して試してみたが、それは目に見える違いはありません。私はGroupLayoutの公式ドキュメントを見てきましたが、水平/垂直GroupGroupLayoutに、またはそれを参照するフィールドにアクセスしたり変更したりする方法はありません。その点についてはGroupを参照してください。 私はここで何をすべきかについて完全に迷っています。可能であれば、新しいタイプのLayoutを学ぶのを避けたいですが、私は私がやろうとしていることを恐れ始めています(あるいは、さらに悪いことに、私がやろうとしていることはまず不可能です) 。

+0

*「これは、クラスの数が不明のためなど、クラスの時間に関する情報を入力する必要。」* 'JTable'のための仕事のようですね。 * "私はすべての可能な場合に新しいタイプのレイアウトを学ぶのを避けたい" *レイアウトの数や結合方法を理解する必要があります。重要ではないGUIベースのアプリケーションを完成させる。 (情報の大部分が 'JTable'で表示されていても)。 –

答えて

2

hereを示すように、あなたは、このアプローチを使用することができます。

  1. まず、必要なParallelGroupSequentialGroupを作成します。
  2. 後で、新しい行を表す目的のグループとコンポーネントを追加します。

以下の例では、add()は新しいラベルとテキストフィールドをレイアウトに追加します。 AdjustmentListenerは、hereと提案され、最後に追加された行までスクロールします。

image

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.AdjustmentEvent; 
import javax.swing.AbstractAction; 
import javax.swing.GroupLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 

/** 
* @see https://stackoverflow.com/a/41926375/230513 
* @see https://stackoverflow.com/a/14858272/230513 
* @see https://stackoverflow.com/a/8504753/230513 
* @see https://stackoverflow.com/a/14011536/230513 
*/ 
public class DynamicGroupLayout { 

    private static final int NUM = 6; 
    private GroupLayout layout; 
    private GroupLayout.ParallelGroup parallel; 
    private GroupLayout.SequentialGroup sequential; 
    private int i; 

    private JPanel create() { 
     JPanel panel = new JPanel(); 
     layout = new GroupLayout(panel); 
     panel.setLayout(layout); 
     layout.setAutoCreateGaps(true); 
     layout.setAutoCreateContainerGaps(true); 
     parallel = layout.createParallelGroup(); 
     layout.setHorizontalGroup(layout.createSequentialGroup().addGroup(parallel)); 
     sequential = layout.createSequentialGroup(); 
     layout.setVerticalGroup(sequential); 
     for (int i = 0; i < NUM; i++) { 
      add(); 
     } 
     return panel; 
    } 

    private void add() { 
     JLabel label = new JLabel(String.valueOf(i + 1), JLabel.RIGHT); 
     JTextField field = new JTextField(String.valueOf("String " + (i + 1))); 
     label.setLabelFor(field); 
     parallel.addGroup(layout.createSequentialGroup(). 
      addComponent(label).addComponent(field)); 
     sequential.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE). 
      addComponent(label).addComponent(field)); 
     i++; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame("DynamicGroupLayout"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       final DynamicGroupLayout dgl = new DynamicGroupLayout(); 
       final JPanel panel = dgl.create(); 
       JScrollPane jsp = new JScrollPane(panel) { 
        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(320, 240); 
        } 
       }; 
       jsp.getVerticalScrollBar().addAdjustmentListener((AdjustmentEvent e) -> { 
        e.getAdjustable().setValue(e.getAdjustable().getMaximum()); 
       }); 
       f.add(jsp); 
       JPanel controls = new JPanel(); 
       controls.add(new JButton(new AbstractAction("Add") { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         dgl.add(); 
         panel.validate(); 
        } 
       })); 
       f.add(controls, BorderLayout.SOUTH); 
       f.pack(); 
       f.setLocationRelativeTo(null); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
関連する問題