2013-07-30 78 views
1

我已經花了一些時間重新學習java和一個奇怪的邏輯錯誤打在這裏。JFrame按鈕邏輯錯誤

import javax.swing.*; 
import java.awt.*; 

class Frame 
{ 
    public static void main (String args[]) 
    { 

     JFrame frame = new JFrame("Tester Frame"); 
     frame.setSize(400, 500); 

     JButton btn1 = new JButton("FOO"); 
     btn1.setSize(150, 50); 
     btn1.setLocation(45, 0); 

     JButton btn2 = new JButton("BAR"); 
     btn2.setSize(150, 50); 
     btn2.setLocation(205, 0); 

     Container content = frame.getContentPane(); 
     content.setBackground(Color.blue); 
     content.add(btn1); 
     content.add(btn2); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    }//end main                           
} 

我創建了2個JButton對象,它們應該是相同的大小,不同的位置和文本。這當然不是這種情況,「FOO」按鈕正是我想要的位置和方式,但「BAR」按鈕是整個框架的大小。

幫助!

回答

4

1)正試圖通過setSizesetLocation等使用Absolute佈局管理,但是沒有調用組件setLayout(null)要添加的JButton s到。 但是,這不是Swing中的最佳做法。

當添加到JFrame的contentPane默認佈局是BorderLayout它增加了組件是BorderLayout.CENTER默認位置。

使用正確LayoutManager時,你會忽略JFrame#setSize(..)調用和設置JFrame可見之前與JFrame#pack()更換有A Visual Guide to Layout Managers

2)也一讀。

3)亦對Concurrency in Swing讀取具體上The Event Dispatch Thread ,其規定了所有擺動部件來經由SwingUtillities.invokeXXX(..)塊上EDT創建:

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     //create and manipulate swing components here 
    } 
}); 

4)亦而使用JFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);因爲這將允許任何其他線程定時器等待JFrame已經處理完畢後再執行。

+3

我認爲默認是BorderLayout,但可能是錯誤的。 – Kon

+0

@ kon +1 yup感謝更正了一陣子;) –

+0

不是問題! – Kon

0

添加到容器的組件在列表中進行跟蹤。列表的順序將定義組件在容器內的前後堆疊順序。如果在向容器添加組件時沒有指定索引,它將被添加到列表的末尾(因此也被添加到堆棧順序的底部)。在您的代碼中,按鈕堆疊在另一個上面。這就是爲什麼您得到這個錯誤(就像你認爲的那樣)。 這將解決你的問題: -

import javax.swing.*; 

import java.awt.*; 

class OP3 
{ 
    public static void main (String args[]) 
    { 

    JFrame frame = new JFrame("Tester Frame"); 
    frame.setSize(400, 500); 

    JButton btn1 = new JButton("FOO"); 
    btn1.setSize(150, 50); 
    btn1.setLocation(45, 0); 

     JButton btn2 = new JButton("BAR"); 
    btn2.setSize(150, 50); 
    btn2.setLocation(205, 0); 

     JPanel p = new JPanel(new FlowLayout()); 
     p.add(btn1); 
     p.add(btn2); 
     frame.add(p); 


     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    }//end main                           
} 
1

地址:

frame.getContentPane().setLayout(null); 

行之後你的代碼:

frame.setSize(400, 500); 
+1

這不是一個正確的方式,應該使用Absolute以外的適當的佈局管理器 –

+1

這取決於您的願望。他特意試圖自己調整和放置按鈕。他並沒有要求一種更好的方式來展示他們,他問他們爲什麼沒有正確放置和確定尺寸。我以我認爲他想要的方式回答了他的問題。建議其他替代方案很好 - 他會選擇他認爲有用的信息。 – Kylar

+0

當使用符合他需要的LayoutManager時,OP可以手動*通過'setXXXSize'或者覆蓋'getXXXSize'手動調整'JButton' –

0

只是一個面板添加到該幀,並添加按鈕面板。

import javax.swing.*; 

import java.awt.*; 

class source 
{ 
    public static void main (String args[]) 
    { 

    JFrame frame = new JFrame("Tester Frame"); 
    frame.setSize(400, 500); 

    JPanel panel=new JPanel();//panel added here 
    panel.setSize(frame.size()); 
    panel.setLocation(0, 0); 

    JButton btn1 = new JButton("FOO"); 
    btn1.setSize(150, 50); 
    btn1.setLocation(45, 0); 

    JButton btn2 = new JButton("BAR"); 
    btn2.setSize(150, 50); 
    btn2.setLocation(205, 0); 

    panel.add(btn1); 
    panel.add(btn2); 

    Container content = frame.getContentPane(); 
    content.setBackground(Color.blue); 
    content.add(panel); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
}//endmain                           
+0

絕對的'LayoutManager'不是最好的實踐時,建立一個體面的揮杆GUI –

+0

@大衛Kroukamp好的謝謝。我知道基本的JAVA,因此我儘可能地給予了幫助。我會閱讀更多關於絕對LayoutManager的信息。 – zindarod