2012-03-01 12 views
1

3つのパネルcsvSrvrPanel、syncPanel、およびmonitoringSrvrPanelを作成しました。 monitoringSrvrPanelには、新しい行のtexboxを追加するボタンがあります。ボタンをクリックすると、新しい行が作成されますが、画面が展開されるまで表示されません。行が追加されると、ウィンドウのサイズを自動的に変更したいと思っていました。行が動的に追加されたときのJPanel /コンポーネントの展開 - Java Swing

ここにそのコードを示します。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.border.Border; 
import javax.swing.border.TitledBorder; 

import test.FormUtility; 

public class Config implements ActionListener { 

JFrame frameConfig = null; 

JPanel comp = null; 
JPanel csvSrvrPanel, syncPanel, monitoringSrvrPanel = null; 
JPanel row = null; 

Border paneEdge = null; 
TitledBorder tbCSVServer, tbMonitoringServer, tbSync = null; 

FormUtility formUtility = null; 

/** 
* @param args 
*/ 
public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 

      new Config().showConfigGUI(); 

     } 

    }); 

} 

public void showConfigGUI() { 

    frameConfig = new JFrame("Server Configurations"); 
    frameConfig.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    comp = new JPanel(new BorderLayout()); 

    paneEdge = BorderFactory.createEmptyBorder(0, 10, 10, 10); 
    comp.setBorder(paneEdge); 

    tbCSVServer = BorderFactory.createTitledBorder("CSV server details"); 
    tbSync = BorderFactory 
      .createTitledBorder("Remote file synchronization details"); 
    tbMonitoringServer = new TitledBorder("Monitoring server details"); 

    csvSrvrPanel = new JPanel(new GridBagLayout()); 
    monitoringSrvrPanel = new JPanel(new GridBagLayout()); 
    syncPanel = new JPanel(new GridBagLayout()); 

    formUtility = new FormUtility(); 

    // Titled border 
    csvSrvrPanel.setBorder(tbCSVServer); 
    monitoringSrvrPanel.setBorder(tbMonitoringServer); 
    syncPanel.setBorder(tbSync); 

    // For CSV server details 
    formUtility.addLabel("Hostname: ", csvSrvrPanel); 
    formUtility.addLastField(new JTextField(30), csvSrvrPanel); 

    formUtility.addLabel("Username: ", csvSrvrPanel); 
    formUtility.addLastField(new JTextField(30), csvSrvrPanel); 

    formUtility.addLabel("CSV Root Folder Path: ", csvSrvrPanel); 
    formUtility.addLastField(new JTextField(30), csvSrvrPanel); 

    // For Monitoring server details 
    JPanel columnNames = new JPanel(new GridLayout(1, 0)); 
    columnNames.add(new JLabel("Server name")); 
    columnNames.add(new JLabel("Folder path")); 

    JPanel buttonPanel = new JPanel(new GridBagLayout()); 
    JButton bAddNewField = new JButton("Add new row"); 
    bAddNewField.addActionListener(this); 

    Dimension bAddNewFieldSize = bAddNewField.getPreferredSize(); 
    bAddNewFieldSize.width = 200; 
    bAddNewField.setPreferredSize(bAddNewFieldSize); 

    buttonPanel.add(bAddNewField); 

    formUtility.addLastField(buttonPanel, monitoringSrvrPanel); 
    formUtility.addLastField(columnNames, monitoringSrvrPanel); 

    row = new JPanel(new GridLayout(1, 0)); 
    row.add(new JTextField(15)); 
    row.add(new JTextField(30)); 

    formUtility.addLastField(row, monitoringSrvrPanel); 

    // For Sync panel 
    formUtility.addLabel("Remote Folder Path: ", syncPanel); 
    formUtility.addLastField(new JTextField(30), syncPanel); 

    formUtility.addLabel("Local Folder Path: ", syncPanel); 
    formUtility.addLastField(new JTextField(30), syncPanel); 

    comp.add(csvSrvrPanel, BorderLayout.NORTH); 
    comp.add(monitoringSrvrPanel, BorderLayout.CENTER); 
    comp.add(syncPanel, BorderLayout.SOUTH); 

    frameConfig.add(comp); 

    frameConfig.setLocationRelativeTo(null); 
    frameConfig.pack(); 
    frameConfig.setVisible(true); 

} 

@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 

    JPanel row = new JPanel(new GridLayout(1, 0)); 
    row.add(new JTextField(15)); 
    row.add(new JTextField(30)); 

    formUtility.addLastField(row, monitoringSrvrPanel); 
    monitoringSrvrPanel.revalidate(); 


} 

} 

おかげで、 Tivakar

+0

'validate()'を呼び出します。それでも成功しない場合は、[SSCCE](http://sscce.org/)を投稿してください。 –

+2

Pack()を使用してサイズ変更を開始できませんでしたか? – Halfwarr

+0

frame.pack()を使用すると問題が解決されます。ありがとうHalfwrr。あなたは正しい答えを選ぶことができるように私の質問に答えることができますか? – Tivakar

答えて

3

私が再サイズをトリガするframe.pack()を使用します。

+0

パックは良い技術的な答えです。ちょっと注意してください。ユーザーは、f.i.に迷惑をかけられるかもしれません。フレームのサイズを変更してカスタムサイズを失った場合 – kleopatra

関連する問題