好的,我有两个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);
}
}
为什么我的画面上不会显示新等级? 谢谢你的帮助!
答案 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);
}
}