【问题标题】:Formatting many checkboxes on Jframe or Jpanel在 Jframe 或 Jpanel 上格式化许多复选框
【发布时间】:2013-03-06 07:48:39
【问题描述】:

我已经有一个句子的集合(列表)。所以我需要把每一个句子都放在一个复选框中。复选框的数量取决于矢量大小的数量。例如,我有 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;
    }
}

【问题讨论】:

  • 所以除了JFrame 默认使用BorderLayout 之外,这意味着您只会看到一个复选框(最后一个),并且您正在尝试给一个窗口加个窗口,你有什么问题?

标签: java swing awt layout-manager jcheckbox


【解决方案1】:

你 extend 来自 JFrame,这通常是不可取的,但让我们继续前进......

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

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

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

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

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

您不能将窗口添加到其他任何东西。与其尝试在createCheckBoxes 中创建另一个窗口,不如直接返回JPanel?

【讨论】:

    【解决方案2】:

    为什么createCheckBoxes() 会返回一个包含所有事物的 JFrame?然后将这个 JFrame 添加到另一个 JFrame 中?对不起,但这根本没有意义。

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

    【讨论】:

      【解决方案3】:

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

      公共类Test实现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);
                  }
              }
          }
      
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2012-05-22
        • 2013-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        • 2014-05-23
        • 1970-01-01
        相关资源
        最近更新 更多