2016-05-21 17 views
1

我有以下代碼JButton的規模都在屏幕

JFrame frame = new JFrame("Organizer"); 
    frame.setBounds(100, 100, 700, 700); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 


    JButton testbutton = new JButton("testbutton"); 
    testbutton.setBounds(0, 0, 55, 55); 

    JButton testbutton2 = new JButton("tdestbutton2"); 
    testbutton2.setBounds(55, 0, 44, 44); 

    frame.add(testbutton2); 
    frame.add(testbutton); 

,有時結果是正確的,有時是這個 enter image description here

什麼即時做錯了什麼?

回答

3

我在做什麼錯?

下面的示例添加了一個具有空邊框的面板和一個填充以匹配的GridLayout。對於這樣的應用,還可以考慮按鈕JToolBar和用於工作屏幕的CardLayout

image

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** 
* @see http://stackoverflow.com/a/37366846/230513 
*/ 
public class Test { 

    private static final int PAD = 50; 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel p = new JPanel(new GridLayout(0, 1, PAD, PAD)); 
     p.setBorder(BorderFactory.createEmptyBorder(PAD, PAD, PAD, PAD)); 
     p.add(new JButton("Test Button 1")); 
     p.add(new JButton("Test Button 2")); 
     f.add(p, BorderLayout.CENTER); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Test()::display); 
    } 
} 
+0

你認爲哪個UI庫更好? – dios231

+0

@ dios231:出於上下文的原因,很難說;爲了實現跨平臺的便利,我幾乎總是更喜歡可用的Java風格(2D,AWT,SWT,Swing,FX)。 – trashgod

3
testbutton.setBounds(0, 0, 55, 55); 
testbutton.setLocation(50, 50); 

testbutton2.setBounds(55, 0, 44, 44); 
testbutton2.setLocation(50, 100); 

擺脫那些語句,因爲那時什麼都不做。

它們什麼都不做,因爲JFrame內容窗格的默認佈局管理器是BorderLayoutBorderLayout將重置每個組件的大小/位置。

當您將組件添加到框架時,BorderLayout期望您提供一個「約束」。如果您不提供約束,則使用「CENTER」。只有一個組件可以添加到「CENTER」中,因此只顯示最後添加的按鈕。

的簡單解決方案理解使用BorderLayout的基本概念是使用:

//frame.add(testbutton2); 
//frame.add(testbutton); 
frame.add(testbutton2, BorderLayout.PAGE_START); 
frame.add(testbutton, BorderLayout.PAGE_END); 

這將顯示在兩行的按鈕。

閱讀有關Layout Managers的Swing教程以獲取更多信息和示例。下載演示代碼並修改代碼將遵循Swing約定。

例如,在使框架可見之前,您需要將組件添加到框架。所以代碼的順序應該是:

frame.add(...); 
frame.add(...); 
frame.pack(); 
frame.setVisible(true);