Java中的简单下拉菜单

15

我正在用Java制作一个非常简单的GUI。

在这个GUI中,我想要显示:

  1. 页面顶部带有一些文本的标签
  2. 在上述标签下方的JComboBox
  3. 在上述JComboBox下方的JButton

这是我的代码:

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)方法,但它们总是显示在相同的位置。

非常感谢!

7个回答

6

使用frame.setLayout(null);,这将允许您将标签、按钮等放置在您喜欢的位置。


1
@NoobNe0,是的,你没有告诉面板上所有对象要去哪里。使用.setBounds(yPosition,xPosition,Hieght,Width)。 - Nerakai
2
哎呀,实际上是.setBounds(yPosition,xPosition,width,height),例如lbl.setBounds(10,10,300,10); - Nerakai

5

如果我理解您的问题正确的话,下面的代码可以实现您要做的事情而且并不过于复杂:

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


4

你应该使用Java标准布局之一(GridLayout、LinearLayout、BoxLayout)

我建议使用一个具有1列和3行的网格布局

像下面这样:

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

3
由于布局用于对子组件进行对齐,所以出现了默认的FlowLayout,它将所有子组件按从左到右的顺序排列,因此您会得到上面的显示效果。根据您的要求,您可以使用3行1列的GridLayout。 GridLayout 所有布局

所以没有简单地将它们一个接一个地显示出来的方法吗?0_o - NoobNe0
当然有。那些布局管理器就像一个容器,里面包含了所有组件。因此你需要选择一个适合你需求的容器。这并不难。试一下吧,你会很高兴看到最终结果以及你可以使用布局管理器做的更多事情。 :) - Atul O Holic

1

学习一些有关使用布局管理器的教程,那里你会找到解决方案。虽然它们很难。


0

你应该使用 BoxLayout, GridBagLayout 或者 GroupLayout 来使你的组件垂直排列。

使用 GridBagLayout 可以将组件放置在一个单元格网格中。
而在 GroupLayout 中,你可以处理垂直布局。

从我的经验来看,使用 Panel.setLayout(null) 不会有太大帮助,因为如果你使用 frame.pack() 使窗口缩小到其内容大小时,框架不会考虑到有内容,它会缩小到最小值。
但是,将布局设置为 null 仍然可以让你手动将组件放置在所需的 x 和 y 值上。


-1

使用Panel.setLayout(null)方法,然后使用setBounds方法为每个组件设置位置,以便根据您的选择进行布局 例如:

JButton btn=new JButton("Press"); 
btn.setBounds(10, 10, 100, 20);//where(x, y, length, height)
JPanel.add(btn);//this is just a snippet, you will have to declare an object
//for the JPanel:)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接