2015-07-05 3 views
0

Скажем, у меня есть JComboBox, который содержит элементы, которые находятся в векторе ...Как скрыть элементы с помощью JComboBox?

public class Shade(){ 
     //code for creating panels etc and other components/containers 
     JCheckBox primary = new JCheckBox("Primary", false);   
     Vector<String> colours = new Vector<String>(); 
} 
public Shade(){ 
//setTitle, look&feel, defaultCloseOperation, Layouts etc etc... 

colours.add(0, "Purple); 
colours.add(1, "Red"); 
colours.add(2, "Blue"); 
colours.add(3, "Magenta"); 

JComboBox<String> colourSelector = new JComboBox<String>(colours); 

} 

Если выбран первичный JCheckBox Я хочу, чтобы «скрыть» цвета фиолетовый и Magneta от JComboBox, после первичного JCheckBox был отменен. Я хотел бы раскрыть скрытые элементы, так что исходный список принадлежит.

Я попытался сделать это ...

public class eventHandler implements itemListener(){ 

    Shade refObj; 
public eventHandler(Shade rinseFM){ 
refObj = rinseFM; 
} 

#Overriding abstract implemented method... 
public void itemStateChanged(ItemEvent event){ 

if(refObj.primary.isSelected() == true){ 
refObj.colours.hide(// index of colours required to hide)) 
} 
} 
} 

Метод шкура на самом деле не существует, есть что-нибудь аналогичное этому.

+0

Не уверен, существует ли такая функция с 'JComboBox'. Возможно, вам придется вручную удалить элементы из модели, а затем добавить их, когда захотите. Или создайте свою собственную реализацию, которая позволяет это. Из того, что я вижу, это не поддерживается –

+0

Если я удалю их, когда я сниму флажок, они не появятся снова. Это проблема, потому что я должен был бы сказать if (refObj.primary.isSelected() == false) // добавьте то, что было удалено , который будет тусклым способом делать то, что я намерен. Также вы можете подробно остановиться на создании моей собственной реализации, которая позволяет это. – RamanSB

ответ

2

Попробуйте это:

private JFrame frame = new JFrame("JComboExample"); 
private JCheckBox primary = new JCheckBox("Primary"); 
private JComboBox<String> colorSelector; 

private String[] colorsToHide = { "Purple", "Magenta" }; 

public JComboExample() { 
    SwingUtilities.invokeLater(() -> { 
     setupFrame(); 
     setupCheckbox(); 
     initJComboBox("Purple", "Red", "Blue", "Magenta"); 
     frame.add(primary, BorderLayout.NORTH); 
     frame.add(colorSelector, BorderLayout.CENTER); 
    }); 
} 

private void setupFrame() { 
    frame.setSize(300, 100); 
    frame.setLocationByPlatform(true); 
    frame.setDefaultCloseOperation(3); 
    frame.setLayout(new BorderLayout()); 
} 

private void setupCheckbox() { 
    primary.addActionListener(event -> { 
     if(primary.isSelected()) { 
      for(String color: colorsToHide) { 
       colorSelector.removeItem(color); 
      } 

     } else { 
      for(String color: colorsToHide) { 
       colorSelector.addItem(color); 
      } 
     } 
    }); 
} 

private void initJComboBox(String... colors) { 
    colorSelector = new JComboBox<String>(colors); 
} 

public void setVisbility(boolean visibility) { 
    frame.setVisible(visibility); 
} 

public static void main(String[] args) { 
    JComboExample example = new JComboExample(); 
    example.setVisbility(true); 
} 

Этот класс реализует функцию обратного вызова (добавляет ActionListener), когда флажок щелкнули. В обратном вызове, когда флажок активирован, мы просто удаляем цвета в массиве colorsToHide. Если флажок не активирован, мы добавляем их обратно.

Боковые ноты:

В Java, вы не должны использовать вектор для этой цели. Векторы в значительной степени считаются устаревшими. См. Это сообщение: Why is Java Vector class considered obsolete or deprecated?

Вы также должны создать все GUI/handle все изменения состояния GUI на EDT. Swing не является потокобезопасным, и, хотя в большинстве случаев он может оказаться ненужным, рекомендуется использовать SwingUtilities.invokeLater или SwingUtilities.invokeAndWait перед обращением к графическому интерфейсу.

+0

Что такое EDT? Что такое потокобезопасность? Что значит -> даже означает? -_- ' – RamanSB

+2

EDT - это событие Dispatch Thread, вы можете прочитать об этом здесь: https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html. Вы можете прочитать эту статью по теме saftey: http://www.javaworld.com/article/2076747/core-java/design-for-thread-safety.html. () -> Является выражением лямбда, вы можете прочитать об этом здесь: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html –

+0

@RamanSB Не забудьте отметить это ответьте как «принятый ответ», если он вам поможет, нажав галочку под стрелками голосования –

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