JPanel установлен в невидимый, выбор в выпадающем списке, отличный от значения по умолчанию, устанавливает его в видимый, но компоненты отсутствуют - PullRequest
4 голосов
/ 13 февраля 2011

Я создаю приложение закона Ома. Пожалуйста, имейте в виду, что это моя первая программа (без учебников), поэтому будьте добры =) Вот как она выглядит при запуске:

http://imgur.com/QYe4V

В комбинированном окне есть параметры для расчета вольт, омов и т. Д. *

Центральная панель установлена ​​невидимой, пока вы не сделаете выбор из выпадающего списка. Вот как это должно выглядеть, когда вы делаете выбор:

http://imgur.com/ZlWJX

Проблема, с которой я сталкиваюсь, заключается в том, что первый первый раз, когда я делаю выбор, отображается только одна из комбинаций JLabel / JTextArea (каждая пара находится на отдельной панели внутри вертикального поля):

http://imgur.com/vNYX1

Если я щелкну comboBox и снова сделаю тот же выбор, он отобразится правильно. Я не могу понять, почему он действует неправильно при первом нажатии. Возможно, я придерживаюсь неправильного подхода при создании 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 () и другими различными вещами, но я ничего не могу придумать. Любая помощь, руководство или критика приветствуется.

Ответы [ 3 ]

3 голосов
/ 13 февраля 2011

«Пожалуйста, имейте в виду, что это моя первая программа (без учебников)» - Молодцы, молодцы. Одно из предложений заключается в том, что вы можете рассмотреть возможность превращения ваших электрических блоков в перечисление, так как они кажутся идеальным местом для практики этой важной концепции. Кроме того, вы, JTextFields, можете лучше выровняться с 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;
   }
}

Тогда выбор пользователей может быть перечислением, и это может упростить часть кода в логической части вашего графического интерфейса.

3 голосов
/ 13 февраля 2011

Любая помощь, руководство или критика приветствуются

Другой вариант - использовать Макет карты .В учебнике есть рабочий пример, который делает именно то, что вы хотите.

0 голосов
/ 25 ноября 2012

Я понял, у меня была первая панель (та, которая правильно отображалась), объявленная как JPanel, а остальные 2 я объявил как обычные.Sheesh!В любом случае, если кто-то хочет дать какой-нибудь совет или критику, это все еще приветствуется!- боты

...