JFrame不会显示JPanel或JCheckBoxes

时间:2015-12-18 00:10:33

标签: java swing jframe

出于某种原因,我的JFrame不会显示两者中的任何一个。 请注意,我的JFrame是在另一个类中创建的,并从中进行访问。 另外,如果可以的话,我想了解我的代码如何呈现和设计的提示?

import java.awt.BorderLayout;
import java.util.ArrayList;

import javax.swing.JCheckBox;
import javax.swing.JPanel;

public class GuiDrugContents {

 private JPanel panel;

 public GuiDrugContents(ArrayList<String> drug_names){

        // Firstly create the panel for the checkboxes to be held.
        JPanel panel = new JPanel(new BorderLayout());
        this.panel = panel;

        testmain.frame.add(panel);

          // Now create an array list of checkboxes.
        ArrayList<JCheckBox> checkboxes = new ArrayList<JCheckBox>();
        checkboxes = getCheckBoxes(drug_names);

        // Now add the JPanel to the JFrame
                testmain.frame.add(panel);

        // Now add these checkboxes to the JPanel.
        addCheckBoxes(checkboxes);

        testmain.frame.repaint();

    }
    /**
     * Takes an array list of JCheckBoxes and adds each one to the panel.
     */
    private void addCheckBoxes(ArrayList<JCheckBox> checkboxes) {
        for(JCheckBox checkbox: checkboxes){
            panel.add(checkbox);
        }

    }
    /**
     * Takes the array list of drug names as strings and makes an array list
     * of JCheckBoxes out of these. 
     * @param drug_names
     * @return
     */
    private ArrayList<JCheckBox> getCheckBoxes(ArrayList<String> drug_names) {
        ArrayList<JCheckBox> arraylist = new ArrayList<JCheckBox>();
        for(String drug_name: drug_names){
            JCheckBox checkbox = new JCheckBox(drug_name);
            arraylist.add(checkbox);
        }
        return arraylist;
    }
}

1 个答案:

答案 0 :(得分:1)

如@MadProgrammer所述,您的小组正在使用BorderLayout,您可能希望使用BoxLayout垂直放置它们。

我创建了这个示例,它为复选框创建了一个水平对齐或垂直对齐,具体取决于您评论的哪一行。

FlowLayout用于水平对齐

enter image description here

BoxLayout用于垂直对齐

enter image description here

来自你的评论:

  

我尝试重新验证它,它的完成只是创建了最后一个CheckBox ...是不是因为CheckBox对象无法在循环中创建,因为下一个CheckBox只是替换了之前的?我想是的..

同样@MadProgrammer已在他的评论中回答,是的,你可以在循环中创建它们,这就是我在下面的例子中所做的:

import java.awt.*;
import javax.swing.*;
public class CheckBoxesInALoop {
    JFrame frame;
    JCheckBox box;
    JPanel boxPane, buttonPane;
    JButton button;
    public static void main (String args[]) {
        new CheckBoxesInALoop();
    }

    public CheckBoxesInALoop() {
        frame = new JFrame("Boxes added in a loop");
        boxPane = new JPanel();
        buttonPane = new JPanel();
        button = new JButton("I do nothing");

        boxPane.setLayout(new FlowLayout()); //Horizontal add
        //boxPane.setLayout(new BoxLayout(boxPane, BoxLayout.PAGE_AXIS)); //Vertical add

        for (int i = 0; i < 5; i++) { //Change for your array list boxes
            box = new JCheckBox("I am the " + (i + 1) + " checkbox"); //we re use the same "box" object (similar to your arraylist)
            boxPane.add(box);
        }
        buttonPane.add(button);

        frame.add(boxPane, BorderLayout.PAGE_START);
        frame.add(buttonPane, BorderLayout.PAGE_END);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

但是将来你应该创建一个简单的代码,称为MCVESSCCE。这将改善您的问题以及您可能获得的答案的数量和质量。