2017-05-11 163 views
-1

我使用的IDE是Intellij。 在這裏我創建了一個轉換貨幣的小程序。 我使用BorderLayout作爲根面板,flowLayout作爲底部按鈕。對於西部和東部的面板,我使用了GridLayout(Intellij)。 當我運行該程序時,通常像這樣顯示:如何讓元素根據JAVA swing中的窗口大小自動調整大小?

enter image description here

改變其大小之後,元素之間的差距開始擴大這樣的: enter image description here

如何讓他們調整距離自動?

這裏是我的代碼:

import javax.swing.*; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 

    /** 
    * Created by Bob on 2017/5/11. 
    */ 



public class layout { 

private JPanel converterRootPanel; 
private JPanel westPanel; 
private JLabel selectNationPanel; 
private JLabel currencyToConvett; 
private JLabel currencyConverted; 
private JComboBox currencyType; 
private JTextField input; 
private JTextField output; 
private JPanel eastPanel; 
private JPanel southPanel; 
private JButton convertButton; 
private JButton clearButton; 
private JLabel convertToLabel; 
private JComboBox convertType; 
private JPanel northPanel; 
public int selection1; 
public int selection2; 
public Double toConvert; 
public double[][] rate1={{0,0.1335,0.1449,16.5172,163.4922},{7.4927,0,1.0857,123.7900, 
     1225.0380},{6.9029,0.9382,0,114.01,1129.19},{0.06053,0.00808,0.008771,0,9.9043},{0.006112, 
     0.0008158,0.0008856,0.101,0}}; 

public layout() { 
    currencyType.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      selection1 = currencyType.getSelectedIndex(); 
     } 
    }); 
    convertType.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      selection2 = convertType.getSelectedIndex(); 
     } 
    }); 

    convertButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if(selection1==selection2){ 
       JOptionPane.showConfirmDialog(null, "You have to choose different currency types!", "Error Alert", JOptionPane.CANCEL_OPTION); 
      } 
      output.setText(""); 
      toConvert = Double.parseDouble(input.getText().toString()); 
      Double convertResult = toConvert*rate1[selection1][selection2]; 
      output.setText(convertResult.toString()); 
     } 
    }); 
    clearButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      output.setText(""); 
      input.setText(""); 
      convertType.setSelectedIndex(0); 
      currencyType.setSelectedIndex(0); 
     } 
    }); 
} 

public static void main(String[] args) { 
    JFrame frame = new JFrame("layout"); 
    frame.setContentPane(new layout().converterRootPanel); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
    //layout lay = new layout(); 
} 

private void createUIComponents() { 
    // TODO: place custom component creation code here 
} 

}

+1

似乎從來沒有組合框所示的代碼來創建。也似乎有很多不必要的東西。爲了儘快提供更好的幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 –

+1

..但基本上,有很多方法可以使組合框和文本字段伸展到可用寬度。個人將把每個組件放在'CENTER'約束中的'BorderLayout'中,而標籤放在'WEST'中。不幸的是,這將不會對齊標籤的右邊緣。相反,您可能會考慮使用單個「GridBagLayout」或「GroupLayout」。後者大多隻能由IDE中的GUI設計者使用,但GBL可以使用適當的'GridBagConstraint'來擴展輸入組件的寬度。 –

+0

正如Andrew所說,值得發佈[MCVE](http://stackoverflow.com/help/mcve),以便您可以更快地獲得所需的幫助。但是,正如我的回答所說,你所追求的是[佈局管理器](https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html)。如果您希望我進一步澄清我的答案或需要幫助瞭解其中某個部分,請讓我知道 – Dan

回答

3

你想要做的是通過佈局管理器做什麼。 Java中有幾個屬於標準庫的部分,還有其他自定義的部分,如MigLayout。

Java教程對佈局管理器here


GridBagLayout的一個基本的例子一整節將是如下。

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Basic { 
    JFrame frame; 
    JPanel panel; 
    JLabel label; 
    JButton button; 

    public void createAndRun() { 
     frame = new JFrame("Basic Example"); 

     setUp(); 
     frame.getContentPane().add(panel); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private void setUp() { 
     panel = new JPanel(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 

     label = new JLabel("I am a JLabel"); 
     c.gridx = 0; 
     c.gridy = 0; 
     c.fill = GridBagConstraints.BOTH; 
     c.weightx = 0.5; 
     c.weighty = 0; 
     panel.add(label, c); 

     button = new JButton("I am a JButton"); 
     c.gridx = 0; 
     c.gridy = 1; 
     c.weighty = 0.5; 
     panel.add(button, c); 
    } 

    public static void main(String[] args) { 
     Basic b = new Basic(); 
     b.createAndRun(); 
    } 
} 

但是,正如教程所說的那樣。

「GridBagLayout是Java平臺提供的最靈活和最複雜的佈局管理器之一。」

因此,如果您在使用GridBagLayout時遇到問題,可能需要事先查看其他佈局管理器。


最後,我想建議一些方法,您可能會考慮改進您的代碼。

最吸引我眼球的部分是這條線。

frame.setContentPane(new layout().converterRootPanel); 

我會建議不要創建JFrame和初始化您在main方法Layout類。相反,首先需要初始化類,然後調用創建框架的方法。

Layout l = new Layout(); 
l.createFrame(); 

這顯示在上面的示例代碼中。

0

A GridBagLayout使用GridBagConstraints的weightxweighty屬性來確定如何分配額外空間。 GridBagLayout使用列中所有單元格的最大weightx來確定該列中所有單元格的實際水平權重,同樣,一行中所有單元格的最大值決定該行的垂直權重。如果所有列都具有零權重x,則它們都是水平居中的。如果所有行的重量均爲零,則它們都是垂直居中。

通常,一個好的設計是讓輸入字段水平伸展,而標籤始終保持相同的大小。您可能希望行始終具有相同的垂直間距,並且所有額外空間都顯示在整組行的上方或下方。

爲了一個特定的列拉伸的所有單元格,你只需要設置一個weightx細胞在該列:

JPanel buttonPanel = new JPanel(); 
buttonPanel.add(convertButton); 
buttonPanel.add(clearButton); 

converterRootPanel = new JPanel(new GridBagLayout()); 

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.anchor = GridBagConstraints.LINE_END; 

// First row 

converterRootPanel.add(selectNationPanel, gbc); 

gbc.weightx = 1; 

gbc.gridwidth = GridBagConstraints.REMAINDER; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
converterRootPanel.add(currencyType, gbc); 

gbc.weightx = 0; 
gbc.insets.top = 3; 

// Second row 

gbc.gridwidth = 1; 
gbc.fill = GridBagConstraints.NONE; 
converterRootPanel.add(convertToLabel, gbc); 

gbc.gridwidth = GridBagConstraints.REMAINDER; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
converterRootPanel.add(convertType, gbc); 

// Third row 

gbc.gridwidth = 1; 
gbc.fill = GridBagConstraints.NONE; 
converterRootPanel.add(currencyToConvett, gbc); 

gbc.gridwidth = GridBagConstraints.REMAINDER; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
converterRootPanel.add(input, gbc); 

// Fourth row 

gbc.gridwidth = 1; 
gbc.fill = GridBagConstraints.NONE; 
converterRootPanel.add(currencyConverted, gbc); 

gbc.gridwidth = GridBagConstraints.REMAINDER; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
converterRootPanel.add(output, gbc); 

// Button row 

gbc.fill = GridBagConstraints.NONE; 
gbc.anchor = GridBagConstraints.CENTER; 
converterRootPanel.add(buttonPanel, gbc); 
相關問題