2015-06-18 3 views
0

Мне нужно изменить значение текущего значения JComboBox.Как установить значение Combobox для одного из вариантов в списке

Я получил это в моем классе настройки графического интерфейса, используемого Main.class:

package com.tominocz.cookieclicker; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.LineBorder; 

@SuppressWarnings({ "serial", "rawtypes", "unchecked" }) 
public class Settings extends JFrame { 

    private String[] choiceList = { "Default (Arial)", "Comic Sans MS" }; 

    public class ChoiceComboListener implements ActionListener { 
     public void actionPerformed(ActionEvent ev) { 
      JComboBox cb = (JComboBox) ev.getSource(); 
      String currentComboSelection = (String) cb.getSelectedItem(); 
      if (currentComboSelection.equals(choiceList[0])) { 
       Main.SelectedFont = "Arial"; 
       Main.refreshGame(); 
       Main.opt.setSize(240, 105); 
       Save.saveGame(Main.save); 
      } 
      if (currentComboSelection.equals(choiceList[1])) { 
       Main.SelectedFont = "Comic Sans MS"; 
       Main.refreshGame(); 
       Main.opt.setSize(240, 107); 
       Save.saveGame(Main.save); 
      } 
     } 
    } 

    public Settings() { 
     super("Settings"); 
     setLayout(new FlowLayout()); 

     Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 
     int x = (int) (((screen.getWidth()) - this.getWidth())/2 - 200); 
     int y = (int) (((screen.getHeight()) - this.getHeight())/2 - 100); 
     this.setLocation(x, y); 
     this.setAlwaysOnTop(true); 

     this.setIconImage(((ImageIcon) Main.SettingsIcon).getImage()); 

     JPanel northPanel = new JPanel(); 
     northPanel.setIgnoreRepaint(true); 
     northPanel.setBorder(new LineBorder(Color.GRAY)); 
     this.getContentPane().add(northPanel, BorderLayout.NORTH); 
     JComboBox choiceCombo = new JComboBox(choiceList); 
     northPanel.add(Main.ChooseFont); 
     northPanel.add(choiceCombo); 
     choiceCombo.addActionListener(new ChoiceComboListener()); 

     // LOOK HEREEEEEEEEEEEEEEEEEEEEEEE 
     if (Main.SelectedFont.equals("Comic Sans MS")) { 
      [the current JComboBox value(may be the default one - choiceList[0])] = choiceList[1]; 
     } 
     // LOOK HEREEEEEEEEEEEEEEEEEEEEEEE 

     Main.OK.setBorder(null); 
     Main.OK.setBorderPainted(false); 
     Main.OK.setContentAreaFilled(false); 
     add(Main.OK); 
     Main.OK.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       Object source = e.getSource(); 
       if (source instanceof JButton) { 
        Main.opt.dispose(); 
       } 
      } 
     }); 
    } 
} 

Теперь, как я могу изменить значение currentComboSelection если я не доступен для использования его в:

общественных местах() {

...

?

+0

См. Править для ответа –

ответ

3

Предложения:

  • Вы можете установить выбранный элемент в JComboBox в один из двух способов: через setSelectedIndex(int index) или setSelectedItem(Object item) где первый путь, вы выбираете индекс нужного выбора и 2-й путь вы выбираете объект проводится JComboBox (здесь они являются строками), которые должны быть выбраны.

Другие вопросы:

  • вы смотрите, чтобы получать данные из основного класса прямого доступа поле, возможно статическое поле в этом. Не делайте этого, так как это сделает ваш код плотно связанным, настроенным для поиска ошибок, и его трудно улучшить или изменить. Вместо этого используйте строго контролируемые методы геттера. то есть предоставить метод Main a public Font getSelectedFont(), чтобы этот класс мог вызвать метод нестационарным образом без прямого возиться с полями Main, не делая статические поля Main, которые не должны быть статическими.
  • То же самое касается и прямого изменения состояния Main в этом классе настроек - это не то, как безопасно делать Java по тем же причинам, что и выше. Хорошие принципы ООП не выводятся из окна только потому, что вы создаете графический интерфейс, управляемый событиями.
  • Похоже, что это должно быть вторичное окно, которое отображается в главном окне графического интерфейса пользователя. Если это так, это должно отображаться как диалог, такой как JDialog или JOptionPane, а не JFrame. Это предотвратит отображение другого значка на панели инструментов ОС, что гарантирует, что это окно находится поверх главного окна, и, если потребуется, это окно будет отображаться модальным образом.
  • Вы устанавливаете компоновку своей контентной панели на FlowLayout, и все же вы пытаетесь добавить JPanel к своей позиции BorderLayout.NORTH. Это явно не сработает.

Например, простой код, похожий на ваш, который использует JOptionPane для вторичного диалогового окна:

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class TestSettingsPanel { 

    private static void createAndShowGui() { 
     MainPanel mainPanel = new MainPanel(); 

     JFrame frame = new JFrame("Test Settings"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class MainPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 
    public static final String[] CHOICE_LIST = { "Default (Arial)", 
     "Comic Sans MS", "Courier", "Times New Roman" }; 
    private static final int PREF_W = 500; 
    private static final int PREF_H = 400; 
    private JTextField fontField = new JTextField(10); 
    private SettingsPanel settingsPanel; 

    public MainPanel() { 
     fontField.setFocusable(false); 
     fontField.setText(CHOICE_LIST[0]); 

     add(new JLabel("Font: ")); 
     add(fontField); 
     add(new JButton(new SettingsAction("Change Settings"))); 
    } 

    @Override // let's make this bigger 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class SettingsAction extends AbstractAction { 
     private static final long serialVersionUID = 1L; 

     public SettingsAction(String name) { 
     // give our button/Action some text 
     super(name); 
     int mnemonic = (int) name.charAt(0); 
     putValue(MNEMONIC_KEY, mnemonic); // set alt-key combination short-cut 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     // create our settingsPanel in a lazy fashion 
     if (settingsPanel == null) { 
      settingsPanel = new SettingsPanel(); 
     } 

     // set the combo selection by calling the setSetting method: 
     settingsPanel.setSetting(fontField.getText()); 

     // create a JOptionPane and dsiplay the settingsPanle inside of it 
     Component parentComponent = MainPanel.this; 
     String title = "Change Font Settings"; 
     int optionType = JOptionPane.OK_CANCEL_OPTION; 
     int messageType = JOptionPane.PLAIN_MESSAGE; 
     // display JOptionPane here 
     int result = JOptionPane.showConfirmDialog(parentComponent, 
       settingsPanel, title, optionType, messageType); 
     // find out what button user pressed 
     if (result == JOptionPane.OK_OPTION) { 
      // if OK button pressed, extract information from settingsPanel 
      String fontType = settingsPanel.getFontType(); 
      fontField.setText(fontType); 
     } 
     } 
    } 
} 

// note that SettingsPanel is completely ignorant about the GUI that displays it. 
class SettingsPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private JComboBox<String> choiceListCombo = new JComboBox<>(MainPanel.CHOICE_LIST); 

    public SettingsPanel() { 
     add(new JLabel("Select Font:")); 
     add(choiceListCombo); 
    } 

    // to allow outside classes to set the combo's selected item 
    public void setSetting(String text) { 
     if (text != null && !text.trim().isEmpty()) { 
     choiceListCombo.setSelectedItem(text); 
     } 
    } 

    // allow outside classes to extract the selected item from combo 
    public String getFontType() { 
     return (String) choiceListCombo.getSelectedItem(); 
    } 

} 
0

Вы можете получить и установить выбранный объект (Object) вашего Combobox с помощью методы:

choiceCombo.getSelectedItem(); 

и

choiceCombo.setSelectedItem(anObject); 
+0

В первый раз я не понял, как это работает .. Я имею в виду, что я думал, что он работает в обратном порядке от реальной функции .. вы знаете, что я имею в виду ..: D Спасибо много! –

Смежные вопросы