2013-07-22 155 views
2

所以,我的JFrame不是我想要的方式,因爲FlowLayout(),但我不知道還有什麼可以用來解決這個問題。它只是讓我的JButton填充整個JFrame。有沒有辦法讓FlowLayout()將我的自定義尺寸和位置應用於JFrame組件,還是有替代方案可以輕鬆替代它?我應該用什麼來代替FlowLayout()?

這裏是我的代碼:

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

public class MTGSAMPServerReference extends JFrame implements ActionListener { 

    public static Toolkit tk = Toolkit.getDefaultToolkit(); 
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth()); 
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight()); 

    private static final long serialVersionUID = 1L; 
    private static JList list1; 
    private static JButton next; 

    public MTGSAMPServerReference() { 
     // set flow layout for the frame 
     this.getContentPane().setLayout(new FlowLayout()); 
     Object[] data1 = { "Value 1", "Value 2", "Value 3", "Value 4", "Value 5" }; 
     list1 = new JList<Object>(data1); 
     next = new JButton("Next"); 
     next.addActionListener(this); 
     // add list to frame 
     add(list1); 
     add(next); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getActionCommand().equals("Next")) { 
      int index = list1.getSelectedIndex(); 
      System.out.println("Index Selected: " + index); 
      String s = (String) list1.getSelectedValue(); 
      System.out.println("Value Selected: " + s); 
     } 
    } 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame f = new MTGSAMPServerReference(); 
     //Display the window. 
     f.pack(); 
     f.setVisible(true); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.setSize(1200, 800); 
     f.setLocationRelativeTo(null); 
     list1.setSize(250, 250); 
     list1.setLocation(0, 0); 
     next.setSize(75, 25); 
     next.setLocation(251, 276); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     createAndShowGUI(); 
     } 
     }); 
    } 
} 

任何想法?

在此先感謝!

編輯:這是一個問題的圖片。

This is the problem.

編輯:這是我希望它看起來像(大約):

This is about what it should look like.

+0

* 「這只是讓我的JButton填滿整個JFrame的」 *別在這裏沒有。提供GUI的ASCII藝術,因爲它應該以最小的尺寸出現並且(如果可調整大小)以額外的寬度/高度出現。另外,請在源代碼頂部包含導入,並在發佈之前修復任何編譯器警告。我有你的代碼版本,這樣做。你想讓我把它編輯成問題嗎? –

+0

或者只是發佈圖片或鏈接。 – tbodt

+0

@AndrewThompson現在做什麼?我應該截取一下它的外觀嗎? – knorberg

回答

3

本示例將按鈕放在列表下方,並使用滾動窗格向列表添加邊框。 GUI中的「空白區」部分由佈局的構造函數中定義的間距(例如列表和按鈕之間的空間)提供,部分通過使用EmptyBorder提供。

然後將控制面板(使用BorderLayout)放置在另一個FlowLayout內。

GUI

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

public class MTGSAMPServerReference extends JFrame implements ActionListener { 

    public static Toolkit tk = Toolkit.getDefaultToolkit(); 
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth()); 
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight()); 

    private static final long serialVersionUID = 1L; 
    private static JList list1; 
    private static JButton next; 

    public MTGSAMPServerReference() { 
     // set flow layout for the frame 
     this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING)); 
     Object[] data1 = { "Value 1", "Value 2", "Value 3", "Value 4", "Value 5" }; 

     JPanel controls = new JPanel(new BorderLayout(5,5)); 

     list1 = new JList<Object>(data1); 
     list1.setVisibleRowCount(5); 
     next = new JButton("Next"); 
     next.addActionListener(this); 
     // add list to frame 
     controls.add(new JScrollPane(list1)); 
     controls.add(next, BorderLayout.PAGE_END); 
     // adjust numbers as needed. 
     controls.setBorder(new EmptyBorder(25,25,0,0)); 

     add(controls); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getActionCommand().equals("Next")) { 
      int index = list1.getSelectedIndex(); 
      System.out.println("Index Selected: " + index); 
      String s = (String) list1.getSelectedValue(); 
      System.out.println("Value Selected: " + s); 
     } 
    } 

    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame f = new MTGSAMPServerReference(); 
     //Display the window. 
     f.pack(); 
     f.setVisible(true); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.setSize(1200, 800); 
     f.setLocationRelativeTo(null); 
     list1.setSize(250, 250); 
     list1.setLocation(0, 0); 
     next.setSize(75, 25); 
     next.setLocation(251, 276); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     createAndShowGUI(); 
     } 
     }); 
    } 
} 
+0

因此,這允許定製'FlowLayout()',是否正確?我發現它可以移動組件/ – knorberg

+2

運行它,然後在'BorderLayout'和'EmptyBorder'構造函數中播放數字。 ..然後閱讀每個構造函數的JavaDocs。 –

+0

非常感謝你!這應該令人驚訝! – knorberg

-2

如果要對其中的各個部件都放在完全控制,並有setBounds工作,您需要刪除佈局管理器。這可以通過將佈局管理器設置爲null來完成。然而,這並不是一個好主意,而且最好只使用佈局管理器,根本不使用setBounds,因爲您沒有將其綁定到特定的窗口大小和默認的組件大小,以及具有特定大小的組件在一個外觀和感覺可能不太好看另一個。

+0

我想完全控制,但不想做任何不好的做法。我正在學習,並且想知道做到這一點的最佳方式。 – knorberg

+0

這兩個需求相互衝突。開始時你應該使用佈局管理器。它保證很好地放置你的組件。 – tbodt

+3

自動-1甚至提到'setBounds'。這僅僅是專家使用,甚至是在極端罕見的情況下才使用。 –

相關問題