【问题标题】:Java multiple CheckBoxesJava 多个复选框
【发布时间】:2014-05-14 23:46:54
【问题描述】:

我有多个复选框的问题。当我用我的代码创建它们时,它只显示最后一个框“bolonska zmes”,其他框仅在鼠标悬停时显示。我认为这可能是层的一些问题,但我不知道该怎么做。谢谢你的帮助。

  public class OknoPizzaVlastna extends JFrame
    {
         private String nazvy[] = { "cesnak", "feferony", "hrasok", "cibula",
         "kecup", "tatarskaOmacka", "vajce",
         "kapia", "fazula", "kukurica", "ananas", "brokolica",
         "Niva", "Mozarella", "olivy", "inovec udeny", "articoky",
         "klobasa", "sampiony", "salama", "slanina", "hranolky", "tuniak",
         "sunka", "kuracie maso", "syr", "Morska zmes", "bolonska zmes"};

         private JCheckBox boxes[];

        public OknoPizzaVlastna()
        {
            boxes = new JCheckBox[nazvy.length];

            for (int i = 0; i < nazvy.length; i++) 
            {            
                createrCheckBox(i);          
            }

            setTitle("Vlastna Pizza");
            setSize(480,320);
            setVisible(true);
            setResizable(true);

            getContentPane().setLayout(null);
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }

        public void createrCheckBox(int i)
        {
            boxes[i] = new JCheckBox();
            //proper locations will be solved later
            boxes[i].setLocation(62+i*30,54+i*20); 
            boxes[i].setSize(100,50);
            boxes[i].setText(nazvy[i]);
            boxes[i].setSelected(false);
            boxes[i].setVisible(true);
            getContentPane().add(boxes[i]);  
        } 
    }

【问题讨论】:

  • 使用GridLayout,而不是setLocation()setSize()
  • Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要为强大的 GUI 组织组件,请改用布局管理器或 combinations of them,以及 white space 的布局填充和边框。
  • 在添加内容之前设置布局管理器,之后更改布局管理器会产生奇怪的结果。

标签: java swing jframe jcheckbox


【解决方案1】:

如果问题是“如何布局这个 GUI?”答案可能是:

要组织组件以获得强大的 GUI,请使用布局管理器或 combinations of them,以及 white space 的布局填充和边框。

在这种情况下,我们使用单个列 GridLayout,每个复选框上都有一个 EmptyBorder,以便在我们继续向下菜单时连续缩进更大的数量。

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

public class OknoPizzaVlastna extends JFrame {

    private String nazvy[] = {
        "cesnak", "feferony", "hrasok", "cibula",
        "kecup", "tatarskaOmacka", "vajce",
        "kapia", "fazula", "kukurica", "ananas", "brokolica",
        "Niva", "Mozarella", "olivy", "inovec udeny", "articoky",
        "klobasa", "sampiony", "salama", "slanina", "hranolky", "tuniak",
        "sunka", "kuracie maso", "syr", "Morska zmes", "bolonska zmes"
    };

    JPanel ui= new JPanel(new GridLayout(0,1,4,4));

    private JCheckBox boxes[];

    public OknoPizzaVlastna() {
        ui.setBorder(new EmptyBorder(10,10,10,10));
        setContentPane(ui);
        boxes = new JCheckBox[nazvy.length];

        for (int i = 0; i < nazvy.length; i++) {
            createrCheckBox(i);
        }

        setTitle("Vlastna Pizza");
        pack();
        setVisible(true);
        setResizable(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    public void createrCheckBox(int i) {
        boxes[i] = new JCheckBox(nazvy[i]);
        boxes[i].setBorder(new EmptyBorder(0,i*30,0,0));
        ui.add(boxes[i]);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                JFrame frame = new OknoPizzaVlastna();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2019-02-13
    • 2019-11-30
    • 1970-01-01
    相关资源
    最近更新 更多