2016-05-19 8 views
0

JPanelを5個含むBox.createVerticalBox()レイアウトのJPanelがあります。 (1)ラベル、(2)テーブル(3)JTextFieldの(4)JTextAreaの(5)buttons.Onリサイズ:JPanelの個々のコンポーネントのJavaサイズ変更

ラベルが左コーナーを上部と同じサイズを保つために固執する必要があり、
のJTextFieldに固執する必要があります(2)と(4)の間の左のサイズに拡大し、フレームの全幅に拡大
ボタンは右下に固定して同じサイズを維持する必要があります。
JTableとJTextAreaはフレームの全幅に拡張し、残りのスペース

私はいくつかのレイアウトを試しましたが、サイズ変更作業を行うことができませんでした。

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class EditPanel extends JPanel { 
    private JPanel p1Labels; 
    private JPanel p2Table; 
    private JPanel p3ecnTitle; 
    private JPanel p5Buttons;  
    private JTextField fieldK; 
    private JTextField fieldS; 
    private JScrollPane myScrollBar; 
    private Box theBox; 

    public EditPanel() { 
     init(); 
    } 

    public void init() { // Creating a vertical Box layout with five sections, placing jpanels there 

     //First panel with buttons 

     p1Labels = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); 
     fieldK = new JTextField("Animal"); 
     fieldS = new JTextField("Fox");   
     p1Labels.add(new JLabel("Kindom: ")); 
     p1Labels.add(fieldK); 
     p1Labels.add(new JLabel("Species: ")); 
     p1Labels.add(fieldS); 

     //Second panel with a table 

     p2Table = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); 
     String[] columnNames = {"First", "Second", "Third", "Fourth"}; 
     Object[][] data = {{"11", "12", "13", "Forteen"},{"21", "22", "23", "Twenty four"}}; 
     JTable table = new JTable(data, columnNames); 
     JScrollPane scrollPane1 = new JScrollPane(new JTable(data, columnNames)); 
     table.setFillsViewportHeight(true); 
     p2Table.add(scrollPane1, BorderLayout.CENTER); 

     //Third panel with a JTextField 

     p3ecnTitle = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); 
     p3ecnTitle.add(new JLabel("Title: ")); 
     p3ecnTitle.add(new JTextField("", 14)); 

     //Forth panel with JTextArea 
     //p4TextArea = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2));//tried this too 
     JTextArea ecnArea = new JTextArea(10, 20);   
     ecnArea.setText(""); 
     ecnArea.setName("Note"); 
     ecnArea.setLineWrap(true); 
     ecnArea.setWrapStyleWord(true); 
     myScrollBar = new JScrollPane(ecnArea, 
       JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
       JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

     //Fifth container with buttons 

     p5Buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT, 2, 2)); 
     p5Buttons.add(new JButton("SAVE")); 
     p5Buttons.add(new JButton("DELETE")); 
     p5Buttons.add(new JButton("CANCEL")); 

     //Placing everything in a container 
     theBox = Box.createVerticalBox(); 
     theBox.add(p1Labels); 
     theBox.add(p2Table); 
     theBox.add(p3ecnTitle); 
     //theBox.add(p4TextArea); 
     theBox.add(myScrollBar); 
     theBox.add(Box.createVerticalGlue()); 
     theBox.add(p5Buttons); 
     this.add(theBox); 
    } 
} 

そして、最高のリサイズハンドルレイアウトmain.java

import javax.swing.JFrame; 
public class Main { 
    public static void main(String[] args) { 
     JFrame myFrame; 
     myPanel EditECNDialog; 
     myFrame = new JFrame();  
     EditECNDialog = new myPanel(); 
     myFrame.setTitle("Notes"); 
     myFrame.add(EditECNDialog); 
     myFrame.pack(); 
     myFrame.setLocationRelativeTo(null); 
     myFrame.setVisible(true); 
    } 
} 

: は、2つのクラスがEditPanel.java必要とされているこのプログラムを実行するには? boxlayoutはサイズ変更を処理できますか?

答えて

3

GridBagLayoutは、あなたのアプリに最適なレイアウトマネージャです。 https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

+0

私は注意書きについて知っていますが、2つのコンポーネント(JTextAreaとJTable)の間のスペースを分割するようにレイアウトを設定するにはどうすればよいですか? – Stepan

+1

両方の成分の 'weightx'に同じ値0.5を与えます。 – AhmadWabbi

+2

(1+)これは縦型レイアウトなので、両方のコンポーネントで 'weighty'値を0.5にします。また、 'weighty'は、フレームがサイズ変更されるときに、余分なスペースだけに使用されることにも注意してください。それはあなたがテーブルとテキスト領域が同じサイズになりたい場合はGridBagLayoutのが第一の好適なサイズに基づいてスペースを割り当て、weightxに値に余分なスペースを割り当てているので、それらも同じ優先の高さを持っている必要があります。 – camickr

2

Wabbiが既に提案しているように、GridBagLayoutを使用することができます。しかし、私はコメントで指摘した制限があります。

ただし、テキストエリアとテーブルが常に同じサイズになるようにしたい場合は、Relative Layoutを使用できます。このレイアウトは、固定サイズのコンポーネントに最初にスペースを割り当てます。次に、残りのスペースが、相対的な制約を持つコンポーネントに割り当てられます。

だから、基本的なコードは次のようになります。

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS); 
rl.setFill(true); 
JPanel panel = new JPanel(rl); 
panel.add(labelPanel); 
panel.add(tableScrollPane, new Float(1)); 
panel.add(textField); 
panel.add(textAreaScrollPane, new Float(1)); 
panel.add(buttonsPanel); 

今テーブルとテキスト領域は、フレームのサイズが変更されたとしても同様に縮小/成長します。

ボックスレイアウトアウトサイズ変更はできますか?

はい、このタイプのサイズ変更は処理できます。ボックスレイアウトは、コンポーネントの最大サイズを考慮します。したがって、パネルのgetMaximumSize()メソッドをオーバーライドしてgetPreferredSize()を返すと、パネルの高さは増加しません。

テキスト領域とテーブルのスクロールペインに余分なスペースが与えられます。再び、同じ懸念。各コンポーネントは、元々、その好ましいサイズに基づいてスペースが割り当てられます。

1

gridbagconstraintsには1つの変数を使用する必要があります。あなたができるこの方法c.gridy++; c.gridx=0;c.gridx++;
後で新しいコンポーネントを挿入する方が簡単になります。 Explicit d.gridy=4;は新しいコンポーネントを挿入するのを困難にします。