-1

我已经有一个句子的集合(列表)。所以我需要把每一个句子都放在一个复选框中。复选框的数量取决于矢量大小的数量。例如,我有 50 个句子,所以我需要 50 个复选框。然后用户可以检查要写入文本文件的所需句子。下面的类(ViewerFrame)应该构建一个框架,使其具有与数组列表(ManualSummarySys.sentences)中的句子数量相同的许多复选框。类(ManualSummarySys)运行良好。

public class ViewerFrame {

import java.awt.BorderLayout ;
import java.awt.Font ;
import java.awt.GridLayout ;
import java.awt.ScrollPane ;
import java.awt.event.ActionEvent ;
import java.awt.event.ActionListener ;
import java.util.ArrayList ;
import java.util.List ;
import javax.swing.ButtonGroup ;
import javax.swing.JButton ;
import javax.swing.JCheckBox ;
import javax.swing.JComboBox ;
import javax.swing.JFrame ;
import javax.swing.JLabel ;
import javax.swing.JPanel ;
import javax.swing.JRadioButton ;
import javax.swing.border.EtchedBorder ;
import javax.swing.border.TitledBorder ;
import javax.swing.plaf.metal.MetalBorders ;

public class ViewerFrame extends JFrame {

    private static final int FRAME_WIDTH = 10;
    private static final int FRAME_HEIGHT = 5;
    private JLabel sampleField;
    private List<JCheckBox> checkboxes = new ArrayList<JCheckBox>();
    private ActionListener listener;

    public ViewerFrame() {

        sampleField = new JLabel("choose your prefered sentences");
        add(sampleField, BorderLayout.WEST);

        class ChoiceListener implements ActionListener {

            public void actionPerformed(ActionEvent event) {
            }
        }
        listener = new ChoiceListener();
        createControlPanel();

        setSize(FRAME_WIDTH, FRAME_HEIGHT);
        add(this.createCheckBoxes());

    }

    public void createControlPanel() {
        JFrame sizeGroupPanel = createCheckBoxes();


        JPanel controlPanel = new JPanel();
        controlPanel.setLayout(new GridLayout(3, 1));

        controlPanel.add(sizeGroupPanel);
        controlPanel.add(styleGroupPanel);

        add(controlPanel, BorderLayout.LINE_START);

    }

    public JFrame createCheckBoxes() {
        JFrame frame = new JFrame("Sentences");
        frame.setBorder(new TitledBorder(new EtchedBorder(), "Sentences"));
        for (int i = 0; i < ManualSummarySys.sentences.size(); i++) {
            JCheckBox checkbox = new JCheckBox(ManualSummarySys.sentences.get(i));
            checkboxes.add(checkbox);
            checkbox.addActionListener(listener);
            frame.add(checkbox);

        }
        return frame;
    }
}
4

3 回答 3

3

You extendfrom JFrame,这通常是不可取的,但让我们继续前进......

然后你调用createControlPanel,它调用createCheckBoxes,它创建一个新的JFrame

如果createCheckBoxes您未能为此框架设置布局管理器,则使用 default BorderLayout,这意味着实际上只有一个复选框可见(添加的最后一个)。

回到createControlPanel您尝试将创建的框架添加createCheckBoxes到面板中。您还尝试添加一个名为的对象styleGroupPanel,我在您的代码中的任何地方都找不到对它的引用...

回到构造函数,你调用setSize,这通常是不可取的,你应该使用pack.

最后,您createCheckBoxes再次调用并尝试将框架添加到框架中。

您不能将窗口添加到其他任何内容。与其尝试创建另一个窗口,createCheckBoxes为什么不直接返回 aJPanel呢?

于 2013-03-18T03:13:38.073 回答
2

为什么会createCheckBoxes()返回一个 JFrame 的所有东西?然后你把这个 JFrame 添加到另一个 JFrame 中?对不起,但这根本没有意义。

为了我的钱,如果我想显示一堆这样的复选框,我会使用放置在 JTable 中的 DefaultTableModel。一列是复选框的布尔列,另一列是文本行的字符串列。

于 2013-03-18T02:42:39.597 回答
0

好的,如果它可以帮助有类似问题的人,我将粘贴此代码。请注意这里 - 滚动窗格包含 JPanel,并且滚动窗格在 JDialog(或 showConfirmDialog)上呈现给用户。复选框列表顶部还有“全选”复选框。

公共类测试实现 ItemListener{

List<String> testset;
JCheckBox selectallcheckbox = new JCheckBox();
List<JCheckBox> testscheckboxes = new ArrayList<JCheckBox>();
List<String> cancel = Arrays.asList("cancel");

public UserInputTest(List<String> tests) {
    this.testset = tests;
}

public List<String> GetCheckBoxes() {

    // Create Content Pane as JScrollPane and adding JPanel into scroll pane.  
    JPanel testspanel = new JPanel();
    testspanel.setLayout(new BoxLayout(testspanel, BoxLayout.Y_AXIS));

    JScrollPane pane = new JScrollPane(testspanel,
                                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    pane.setMinimumSize(new Dimension(400, 400));
    pane.setPreferredSize(new Dimension(400, 500));

    // Create Swing Components and adding them to JPanel
    selectallcheckbox.setText("Select All");
    selectallcheckbox.setSelected(false);
    selectallcheckbox.addItemListener(this);

    testspanel.add(selectallcheckbox, 0);
    testspanel.add(Box.createVerticalGlue());

    // Adding each element from string list to one checkbox into the JPanel 
    for(int i = 0; i < testset.size() ; i++) {
        JCheckBox testcheckbox = new JCheckBox();
        testcheckbox.setText(testset.get(i));
        testcheckbox.setSelected(false);
        //testspanel.setComponentZOrder(testcheckbox, i+1);
        testspanel.add(testcheckbox, i+1);
        testspanel.add(Box.createVerticalGlue());
        testscheckboxes.add(i, testcheckbox);
    }

    int x = JOptionPane.showConfirmDialog(null, pane, "Select Tests", JOptionPane.OK_CANCEL_OPTION);

    List<String> InputTestDetails = new ArrayList<String>();
    if (x == JOptionPane.OK_OPTION) {
        for(JCheckBox getvaluechkbox : testscheckboxes) {
            if(getvaluechkbox.isSelected()) {
                InputTestDetails.add(getvaluechkbox.getText());
            }   
        }
        return InputTestDetails;
    }

    else if (x == JOptionPane.CANCEL_OPTION) {
        return cancel; 
    }

    return cancel; 
}


@Override
public void itemStateChanged(ItemEvent e) {

    if(e.getSource() == selectallcheckbox) {    
        if(selectallcheckbox.isSelected() == true){
            for(JCheckBox setchkbox : testscheckboxes) {
                setchkbox.setSelected(true);
            }   
        }
        else {
            for(JCheckBox setchkbox : testscheckboxes) {
                setchkbox.setSelected(false);
            }
        }
    }

}

}

于 2014-10-29T16:21:11.837 回答