我的第二帧

时间:2015-07-31 11:46:33

标签: java swing jpanel actionlistener

好的,我有两个JFrame。第一个是我的主要计划。通过选择第一个菜单上的选项来访问第二个。第二帧允许用户输入不同等级的值。例如,他们可以将等级“A”的范围设置为90 - 100或85 - 100.此外,他们可以添加新的等级,如“A +”或“B-”,并为它们设置范围。

如果用户想要添加成绩,他会使用标题为“操作”的菜单上的“添加行”选项。框架提示用户输入他想要添加的等级(A +或B-),他进入该等级并且应该在正确的位置创建具有该等级的新行。

所以我的问题开始了。标题和成绩存储在JLabels的ArrayList中,我编写了一个算法来准确预测用户输入的新等级的索引(“B +”将在“A-”之后和“B”之前)。因此输入的等级位于我的标签ArrayList中的正确位置。但由于某种原因,新标签不会将其自身添加到我的面板中,因此用户无法看到。

其他一些信息: 1.面板使用网格袋布局 - 列= 3和行=等级数。 2.每个年级都有两个文本字段,用户输入范围值(我没有在文本字段中添加任何功能,它们就在那里,所以我不会忘记它们)

以下是代码:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Adjustments implements ActionListener {

    private JMenuBar menubar;   // for adding more grades
    private ArrayList<JTextField> textFields;
    private ArrayList<JLabel> labels;
    private JPanel panel;
    private JFrame frame;
    private ArrayList<GridBagConstraints> gbcs;
    private JButton button;

    @Override
    public void actionPerformed(ActionEvent e) {
        frame = new JFrame();
        frame.setSize(Frame.LENGTH, Frame.HEIGHT);
        frame.setDefaultCloseOperation(1);
        frame.setTitle("Adjustments");
        createComponents();
        frame.setVisible(true);
    }

    private void createComponents() {
        panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        createLabels();
        createTextFields();
        createMenuBar();
        createLayout();

        frame.setJMenuBar(menubar);
    }

    private void createLayout() {
        // This creates the layout. First makes the constraints, then adds everything to the panel
        gbcs = new ArrayList<GridBagConstraints>();
        for (int i = 0; i < labels.size() - 2; i++) { 
            for (int j = 0; j < 3; j++) { 
                gbcs.add(new GridBagConstraints());
                gbcs.get((i * 3) + j).gridx = 100 + (100 * j);
                gbcs.get((i * 3) + j).gridy = 100 + (100 * i);
            }
        }
        // This is for the three headings on the top - "Grade", "From" and "To"
        for (int i = 0; i < 3; i++) {
            panel.add(labels.get(i), gbcs.get(i));
        }

        int l = 3, tf = 0; // l is the labels count, tf is for text fields
        for (int i = 3; i < gbcs.size(); i++) {
            if (i % 3 == 0) {
                panel.add(labels.get(l), gbcs.get(i));
                l++;
            } else {
                panel.add(textFields.get(tf), gbcs.get(i));
                tf++;
            }
        }
        frame.add(panel);
    }

    private void createLabels() {
        // all the labels are made
        labels = new ArrayList<JLabel>();
        labels.add(new JLabel("Grade"));
        labels.add(new JLabel("From"));
        labels.add(new JLabel("To"));
        labels.add(new JLabel("A"));
        labels.add(new JLabel("B"));
        //      labels.add(new JLabel("B-"));
        labels.add(new JLabel("C"));
        labels.add(new JLabel("D"));
    }

    private void createTextFields() {
        // there are two text fields on each row, starting from the 2nd
        textFields = new ArrayList<JTextField>();
        for (int i = 0; i < 8; i++) {
            textFields.add(new JTextField(5));
        }
    }

    private void createMenuBar() {
        menubar = new JMenuBar();
        // create and add the menu/menu items to the menubar
        JMenu actions = new JMenu("Action");
        JMenuItem addrow = new JMenuItem("Add Row");
        actions.add(addrow);

        class Listener implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                String newGrade = JOptionPane.showInputDialog(frame, "What grade is this?");
                if (newGrade.length() == 2) { // e.g.: ("B+")
                    String s = newGrade.substring(0, 1);
                    int index = 0; // index is the location of grade in the labels ArrayList
                    for (int i = 3; i < labels.size(); i++) {
                        if (s.equals(labels.get(i).getText())) {
                            index = i;
                            break;
                        }
                    }
                    String s2 = newGrade.substring(1);
                    if (s2.equals("-")) index++; 
                    labels.add(index, new JLabel(newGrade));
                    textFields.add(new JTextField(5));
                    textFields.add(new JTextField(5));  
                }
                panel.removeAll(); // removes everything from the panel to be readied again
                createLayout(); // creates the layout everything
            }  
        }
        addrow.addActionListener(new Listener());
        menubar.add(actions);
    }
}

为什么我的画面上不会显示新等级? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

你的代码中有一些错误..但我有一个解决方案。 简短的回答:你忘记了panel.revalidate();&amp;重新创建布局后再panel.repaint();

import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class gui implements ActionListener {
    private JMenuBar menubar; // for adding more grades
    private ArrayList<JTextField> textFields;
    private ArrayList<JLabel> labels;
    private JPanel panel;
    private JFrame frame;
    private ArrayList<GridBagConstraints> gbcs;
    private JButton button;

    @Override
    public void actionPerformed(ActionEvent e) {
        frame = new JFrame();
        frame.setSize(Frame.WIDTH, Frame.HEIGHT);
        frame.setDefaultCloseOperation(1);
        frame.setTitle("Adjustments");
        createComponents();
        frame.setVisible(true);
        frame.pack();
    }

    private void createComponents() {
        panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        createLabels();
        createTextFields();
        createMenuBar();
        createLayout();

        frame.add(panel);
        frame.setJMenuBar(menubar);
    }

    private void createLayout() {
        // This creates the layout. First makes the constraints, then adds
        // everything to the panel
        gbcs = new ArrayList<GridBagConstraints>();
        for (int i = 0; i < labels.size()-2; i++) {
            for (int j = 0; j < 3; j++) {
                gbcs.add(new GridBagConstraints());
                gbcs.get((i * 3) + j).gridx = 100 + (100 * j);
                gbcs.get((i * 3) + j).gridy = 100 + (100 * i);
            }
        }
        // This is for the three headings on the top - "Grade", "From" and "To"
        for (int i = 0; i < 3; i++) {
            panel.add(labels.get(i), gbcs.get(i));
        }

        int l = 3, tf = 0; // l is the labels count, tf is for text fields
        for (int i = 3; i < gbcs.size(); i++) {
            if (i % 3 == 0) {
                panel.add(labels.get(l), gbcs.get(i));
                l++;
            } else {
                panel.add(textFields.get(tf), gbcs.get(i));
                tf++;
            }
        }

        panel.revalidate();
        panel.repaint();
    }

    private void createLabels() {
        // all the labels are made
        labels = new ArrayList<JLabel>();
        labels.add(new JLabel("Grade"));
        labels.add(new JLabel("From"));
        labels.add(new JLabel("To"));
        labels.add(new JLabel("A"));
        labels.add(new JLabel("B"));
        // labels.add(new JLabel("B-"));
        labels.add(new JLabel("C"));
        labels.add(new JLabel("D"));
    }

    private void createTextFields() {
        // there are two text fields on each row, starting from the 2nd
        textFields = new ArrayList<JTextField>();
        for (int i = 0; i < 8; i++) {
            textFields.add(new JTextField(5));
        }
    }

    private void createMenuBar() {
        menubar = new JMenuBar();
        // create and add the menu/menu items to the menubar
        JMenu actions = new JMenu("Action");
        JMenuItem addrow = new JMenuItem("Add Row");
        actions.add(addrow);

        class Listener implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                String newGrade = JOptionPane.showInputDialog(frame,
                        "What grade is this?");
                if (newGrade.length() == 2) { // e.g.: ("B+")
                    String s = newGrade.substring(0, 1);
                    int index = 0; // index is the location of grade in the
                                    // labels ArrayList
                    for (int i = 3; i < labels.size(); i++) {
                        if (s.equals(labels.get(i).getText())) {
                            index = i;
                            break;
                        }
                    }
                    String s2 = newGrade.substring(1);
                    if (s2.equals("-"))
                        index++;
                    labels.add(index, new JLabel(newGrade));
                    textFields.add(new JTextField(5));
                    textFields.add(new JTextField(5));
                }
                panel.removeAll(); // removes everything from the panel to be
                                    // readied again
                createLayout(); // creates the layout everything
            }
        }
        addrow.addActionListener(new Listener());
        menubar.add(actions);
    }
}