【问题标题】:Simple Dropdown menu in JavaJava中的简单下拉菜单
【发布时间】:2014-03-19 12:47:33
【问题描述】:

我正在用 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);

    }
}

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

如图所示,标签、JComboBox 和 JButton 在同一行!

相反,我希望它们如上所述“堆叠”:

JLabel

JComboBox

JButton

我尝试使用 setLocation(int x, int y) 方法,但它们总是显示在相同的位置。

非常感谢!

【问题讨论】:

    标签: java user-interface jbutton jlabel jcombobox


    【解决方案1】:

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

    【讨论】:

    • @NoobNe0 是的,你没有告诉面板上的所有对象去哪里使用 .setBounds(yPosition,xPosition,Hieght,Width)
    • oops 其实是 .setBounds(yPosition,xPosition,width,height),例如 lbl.setBounds(10,10,300,10);
    【解决方案2】:

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

    我建议使用 1 列 3 行的网格布局

    如下图

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

    【讨论】:

      【解决方案3】:

      如果我理解了您的问题,下面的代码可以完成您正在尝试做的事情,而不会过于复杂:

      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】:

        这是由于用于对齐孩子的布局。默认情况下,它的 FlowLayout 将所有子组件从左到右放置在一个流中,因此您会得到上面的显示。

        您可以根据需要使用 3 行 1 列的 GridLayout。

        GridLayout

        All Layouts

        【讨论】:

        • 所以没有办法简单地将它们显示在另一个 0_o 上?
        • 肯定有。这些是布局管理器,它们充当所有组件所在的容器。所以你必须选择一个合适的容器来满足你的需要。它不是那么困难。尝试它们,您会很高兴看到最终结果以及使用 LayoutManagers 可以做的更多事情。 :)
        【解决方案5】:

        学习一些有关使用布局管理器的教程,您将在那里找到解决方案。不过,它们非常强硬。

        【讨论】:

          【解决方案6】:

          使用 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:)
          

          【讨论】:

            猜你喜欢
            • 2012-02-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-27
            • 1970-01-01
            • 2013-11-15
            • 2018-01-27
            • 2012-07-05
            相关资源
            最近更新 更多