2014-03-19 130 views
7

我正在研究Java中非常簡單的GUI。Java中的簡單下拉菜單

在這個界面我想顯示:

  1. 與下提到的標籤
  2. 一個JButton
  3. 的JComboBox下提到的JComboBox
在頁面頂部的一些文字標籤

這裏是我的代碼:

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

public class Prova { 

public static void main(String[] args) { 

    JFrame frame = new JFrame("A Simple GUI"); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(500, 500); 
    frame.setLocation(430, 100); 

    JPanel panel = new JPanel(); 

    frame.add(panel); 

    JLabel lbl = new JLabel("Select one of the possible choices and click OK"); 
    lbl.setVisible(true); 

    panel.add(lbl); 

    String[] choices = { "CHOICE 1","CHOICE 2", "CHOICE 3","CHOICE 4","CHOICE 5","CHOICE 6"}; 

    final JComboBox<String> cb = new JComboBox<String>(choices); 

    cb.setVisible(true); 
    panel.add(cb); 

    JButton btn = new JButton("OK"); 
    panel.add(btn); 

    } 
} 

不幸的是,結果我得到的是

image

正如你可以在圖片中看到,標籤,JComboBox時和JButton的是在同一條線上!

相反,我想他們 「堆疊」 如上所述:

的JLabel

的JComboBox

的JButton

我使用定義的setLocation(INT的x,int y)對方法嘗試,但他們總是表現出相同的立場。

非常感謝!

回答

0

學習使用佈局管理器的一些教程,這就是您可以找到解決方案的地方。儘管如此,他們非常艱難。

2

這是由於用於對齊孩子的佈局。默認情況下,它的FlowLayout將所有的子組件從一個流程開始,從左到右,從而獲得上述顯示。

您可以根據您的要求使用具有3行1列的GridLayout。

GridLayout

All Layouts

+0

所以沒有辦法簡單地顯示他們一個到另一個0_o? – NoobNe0

+0

當然有。這些都是作爲所有組件所在容器的佈局管理器。所以你將不得不選擇一個合適的容器來滿足你的需求。它並不困難。嘗試一下,你會很高興看到最終結果以及使用LayoutManagers可以做的更多事情。 :) –

5

使用frame.setLayout(null);這將允許您以放置標籤,按鈕等你喜歡的地方

+0

我試過,但現在它只顯示空框架! – NoobNe0

+1

@ NoobNe0是的,你沒有告訴面板上的所有物體去哪裏 使用.setBounds(yPosition,xPosition,Hieght,Width) – Nerakai

+2

oops它實際上是.setBounds(yPosition,xPosition,width,height),例如lbl.setBounds(10,10,300,10); – Nerakai

4

您應該使用Java標準佈局的一個(網格佈局,LinearLayout中,BoxLayout的)

我推薦使用1列3行的網格佈局

像下面

setLayout(new GridLayout(1,3)); 
     add(new Button("1")); 
     add(new Button("2")); 
     add(new Button("3")); 
1

如果我明白你的問題,下面的代碼來完成你正在嘗試做的,但又不過度複雜:

import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.BoxLayout; // added code 
import java.awt.Component; // added code 

public class Prova { 

public static void main(String[] args) { 

    JFrame frame = new JFrame("A Simple GUI"); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(500, 500); 
    frame.setLocation(430, 100); 

    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); // added code 

    frame.add(panel); 

    JLabel lbl = new JLabel("Select one of the possible choices and click OK"); 
    lbl.setAlignmentX(Component.CENTER_ALIGNMENT); 
    //lbl.setVisible(true); // Not needed 

    panel.add(lbl); 

    String[] choices = { "CHOICE 1", "CHOICE 2", "CHOICE 3", "CHOICE 4", 
         "CHOICE 5", "CHOICE 6" }; 

    final JComboBox<String> cb = new JComboBox<String>(choices); 

    cb.setMaximumSize(cb.getPreferredSize()); // added code 
    cb.setAlignmentX(Component.CENTER_ALIGNMENT);// added code 
    //cb.setVisible(true); // Not needed 
    panel.add(cb); 

    JButton btn = new JButton("OK"); 
    btn.setAlignmentX(Component.CENTER_ALIGNMENT); // added code 
    panel.add(btn); 

    frame.setVisible(true); // added code 

    } 
} 

setLocation方法往往過於複雜,除非你有非常具體(藝術?)佈局的目標。對於這個問題,更簡單的解決方案是使用BoxLayout並指定要在y方向添加東西(垂直向下)。請注意,您必須指定JComboBox(以及其他一些GUI元素的尺寸想要稍後添加)來避免巨大的下拉菜單。比照另一個stackoverflow後,JComboBox width