【问题标题】:JPanel set to invisible, combobox choice other than default sets it to visible, but components are missingJPanel 设置为不可见,默认组合框选项将其设置为可见,但缺少组件
【发布时间】:2011-06-26 11:22:01
【问题描述】:

我正在构建一个欧姆定律应用程序。请记住,这是我的第一个程序(没有教程),所以请善待 =) 以下是运行它时的样子:

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

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

我面临的问题是,第一次我进行选择时,只显示了一个 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 的内部类,这是组合框侦听器,我尝试过使用 repaint() 和其他各种东西,但我想不出任何东西。感谢您提供任何帮助、指导或批评。

【问题讨论】:

  • “请记住这是我的第一个程序(没有教程)”——干得好,干得好。
  • @Bots 请发表您的评论作为答案并将其标记为答案

标签: java swing jpanel visibility jcombobox


【解决方案1】:

我想通了,我将第一个面板(正确显示的那个)声明为 JPanel,而我将其他 2 个面板声明为常规面板。嘘!无论如何,如果有人想提供一些建议或批评,仍然欢迎! – 机器人

【讨论】:

    【解决方案2】:

    “请记住这是我的第一个程序(没有教程)”——干得好,干得好。一个建议是,您可能希望考虑将您的电气单元变成一个枚举,因为它们似乎是实践这一重要概念的理想场所。此外,您的 JTextField 可能会更好地与 GridBagLayout 对齐,但使用起来可能非常挑剔。

    例如,在枚举上:

    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 逻辑部分中的一些代码。

    【讨论】:

      【解决方案3】:

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

      另一个选项可能是使用Card Layout。本教程有一个工作示例,完全符合您的要求。

      【讨论】:

        猜你喜欢
        • 2011-08-24
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 1970-01-01
        • 2021-08-10
        • 2011-10-16
        相关资源
        最近更新 更多