Java JPanel设置为不可见,combobox选项(默认选项除外)将其设置为可见,但缺少组件

Java JPanel设置为不可见,combobox选项(默认选项除外)将其设置为可见,但缺少组件,java,swing,jpanel,visibility,jcombobox,Java,Swing,Jpanel,Visibility,Jcombobox,我正在构建一个欧姆定律应用程序。请记住,这是我有史以来的第一个程序(没有教程),所以请保持友好=)以下是运行它时的外观: 组合框具有计算电压、计算欧姆等选项 在从组合框中进行选择之前,中心面板将设置为不可见。以下是您进行选择时的外观: 我面临的问题是,在我第一次进行选择时,只有一个JLabel/JTextArea组合(每对组合位于垂直框内的自己的面板上)显示: 如果我单击组合框并再次进行相同的选择,它将正确显示。我不明白为什么它在第一次点击时就不正确。也许我在构建GUI时采取了错误的方法。

我正在构建一个欧姆定律应用程序。请记住,这是我有史以来的第一个程序(没有教程),所以请保持友好=)以下是运行它时的外观:

组合框具有计算电压、计算欧姆等选项

在从组合框中进行选择之前,中心面板将设置为不可见。以下是您进行选择时的外观:

我面临的问题是,在我第一次进行选择时,只有一个JLabel/JTextArea组合(每对组合位于垂直框内的自己的面板上)显示:

如果我单击组合框并再次进行相同的选择,它将正确显示。我不明白为什么它在第一次点击时就不正确。也许我在构建GUI时采取了错误的方法。以下是迄今为止的代码:

private JFrame frame;
private String[] choiceList = {"", "Calculate Volts", "Calculate Amps", "Calculate Ohms", "Calculate Watts"};
private JTextField textField_2;
private JPanel centerPanel;
private String volts = "Volts";
private String amps = "Amps";
private String ohms = "Ohms";
private String watts = "Watts";
private JLabel var1Label;
private JLabel var2Label;
private JLabel var3Label;
private JFormattedTextField var1TextField;
private JFormattedTextField var2TextField;
private JFormattedTextField var3TextField;



/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                GUI window = new GUI();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public GUI() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setTitle("BotsOne ElectriCalc");
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel northPanel = new JPanel();
    northPanel.setIgnoreRepaint(true);
    northPanel.setBorder(new LineBorder(Color.GRAY));
    frame.getContentPane().add(northPanel, BorderLayout.NORTH);

    JLabel choiceLabel = new JLabel("Please make a selection:");
    northPanel.add(choiceLabel);

    JComboBox choiceCombo = new JComboBox(choiceList);
    northPanel.add(choiceCombo);
    choiceCombo.addActionListener(new ChoiceComboListener());

    JPanel southPanel = new JPanel();
    southPanel.setIgnoreRepaint(true);
    southPanel.setBorder(new LineBorder(Color.GRAY));
    frame.getContentPane().add(southPanel, BorderLayout.SOUTH);

    JLabel label = new JLabel("Answer:");
    southPanel.add(label);

    textField_2 = new JTextField();
    textField_2.setColumns(10);
    southPanel.add(textField_2);

    centerPanel = new JPanel();
    centerPanel.setVisible(false);
    centerPanel.setBorder(new LineBorder(Color.GRAY));
    frame.getContentPane().add(centerPanel, BorderLayout.CENTER);

    Box centerPanelVertBox = Box.createVerticalBox();
    centerPanelVertBox.setAlignmentX(Component.CENTER_ALIGNMENT);
    centerPanel.add(centerPanelVertBox);
    centerPanelVertBox.setVisible(true);
    centerPanelVertBox.setBorder(null);

    JLabel pleaseEnterLabel = new JLabel("Please enter 2 of 3 values:");
    pleaseEnterLabel.setBorder(new EmptyBorder(15, 0, 10, 0));
    pleaseEnterLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
    centerPanelVertBox.add(pleaseEnterLabel);

    JPanel var1Panel = new JPanel();
    centerPanelVertBox.add(var1Panel);

    var1Label = new JLabel("xxx");
    var1Label.setAlignmentX(Component.CENTER_ALIGNMENT);
    var1Panel.add(var1Label);

    var1TextField = new JFormattedTextField(NumberFormat.getInstance());
    var1TextField.setColumns(10);
    var1Panel.add(var1TextField);

    Panel var2Panel = new Panel();
    centerPanelVertBox.add(var2Panel);

    var2Label = new JLabel("xxx");
    var2Label.setAlignmentX(Component.CENTER_ALIGNMENT);
    var2Panel.add(var2Label);

    var2TextField = new JFormattedTextField(NumberFormat.getInstance());
    var2TextField.setColumns(10);
    var2Panel.add(var2TextField);

    Panel var3Panel = new Panel();
    centerPanelVertBox.add(var3Panel);

    var3Label = new JLabel("xxx");
    var3Label.setAlignmentX(Component.CENTER_ALIGNMENT);
    var3Panel.add(var3Label);

    var3TextField = new JFormattedTextField(NumberFormat.getInstance());
    var3TextField.setColumns(10);
    var3Panel.add(var3TextField);

    Panel calculatePanel = new Panel();
    centerPanelVertBox.add(calculatePanel);

    JButton calculateButton = new JButton("Calculate");
    calculatePanel.add(calculateButton);
}

public class ChoiceComboListener implements ActionListener {    //combobox actionlistener

    public void actionPerformed(ActionEvent ev) {
        JComboBox cb = (JComboBox)ev.getSource();
        String currentComboSelection = (String)cb.getSelectedItem();
        if (currentComboSelection.equals(choiceList[1])) {                  //choice 1 (Calculate Volts)
            centerPanel.setVisible(true);
            var1Label.setText(amps);
            var2Label.setText(ohms);
            var3Label.setText(watts);               
            //centerPanel.repaint();                
        }
        if (currentComboSelection.equals(choiceList[2])) {                //choice 2 (Calculate Amps)
            centerPanel.setVisible(true);
            var1Label.setText(volts);
            var2Label.setText(ohms);
            var3Label.setText(watts);
            centerPanel.repaint();              
        }
        if (currentComboSelection.equals(choiceList[3])) {
            centerPanel.setVisible(true);
            var1Label.setText(volts);
            var2Label.setText(amps);
            var3Label.setText(watts);
        }
        if (currentComboSelection.equals(choiceList[4])) {
            centerPanel.setVisible(true);
            var1Label.setText(volts);
            var2Label.setText(amps);
            var3Label.setText(ohms);
        }
        if (currentComboSelection.equals(choiceList[0])) {
            centerPanel.setVisible(false);
            //centerPanel.repaint();
        }
    }

}
如果你看底部,有一个叫做ChoiceComboListener的内部类,这是comboBox监听器,我尝试过使用repaint()和其他各种方法,但我想不出任何方法。感谢您的帮助、指导或批评

感谢您的任何帮助、指导或批评


另一个选项可能是使用。本教程提供了一个工作示例,完全满足您的要求。

“请记住,这是我有史以来第一个程序(没有教程)”——做得好,做得好。一个建议是,你可能希望考虑使你的电气单元成为一个枚举,因为他们似乎是一个完美的地方来实践这个重要的概念。此外,JTextFields可以更好地与GridBagLayout对齐,但使用起来可能非常挑剔

e、 例如,在枚举上:

enum ElectricalUnits {
   AMPS("Amps"), OHMS("Ohms"), WATTS("Watts"), VOLTS("Volts");

   private String text;
   private ElectricalUnits(String text) {
      this.text = text;
   }
   public String getText() {
      return text;
   }
   @Override
   public String toString() {
      return text;
   }
}

然后用户可以选择一个枚举,这可能会简化gui逻辑部分中的一些代码。

我想出来了,我将第一个面板(正确显示的面板)声明为JPanel,并将其他两个面板声明为常规面板。嘘!无论如何,如果有人想提供一些建议或批评,我们仍然欢迎Bots

“请记住这是我有史以来第一个程序(没有教程)”--做得好,做得好。@Bots请将您的评论作为答案发布,并将其标记为答案