2013-09-26 3 views
0

У меня возникла проблема с моим самым новым проектом. Я новичок, так что имейте это в виде: DФлажки ItemListener не работают должным образом

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

Мне уже удалось реализовать это.

Однако есть несколько рядов флажков. Если выбрано 2, и я отмениваю выбор одного из них, текст снова изменится. Я не хочу, чтобы текст стал нормальным, пока флажок в столбце все еще выбран.

Как я могу это сделать? = (

Надеюсь, один из вас может мне помочь!

import java.awt.Color; 

public class WindowBuilderTest extends JFrame 
{ 

private JPanel contentPane; 

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

// Creating Frame 
public WindowBuilderTest() 
{ 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 1280, 720); 
    this.contentPane = new JPanel(); 
    this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(this.contentPane); 
    this.contentPane.setLayout(null); 

    // Create Font 
    final Font headfont = new Font("Serif", Font.PLAIN, 15); 
    final Font headfontRed = new Font("Serif", Font.PLAIN, 15); 

    // Role Headlines 
    final JTextArea txtTop = new JTextArea(); 
    txtTop.setEditable(false); 
    txtTop.setText("TOP"); 
    txtTop.setBounds(180, 95, 32, 23); 
    this.contentPane.add(txtTop); 

    final JTextArea txtMid = new JTextArea(); 
    txtMid.setEditable(false); 
    txtMid.setText("MID"); 
    txtMid.setBounds(252, 95, 32, 23); 
    this.contentPane.add(txtMid); 

    final JTextArea txtJng = new JTextArea(); 
    txtJng.setEditable(false); 
    txtJng.setText("JNG"); 
    txtJng.setBounds(320, 95, 32, 23); 
    this.contentPane.add(txtJng); 

    final JTextArea txtAdc = new JTextArea(); 
    txtAdc.setEditable(false); 
    txtAdc.setText("ADC"); 
    txtAdc.setBounds(389, 95, 32, 23); 
    this.contentPane.add(txtAdc); 

    final JTextArea txtSup = new JTextArea(); 
    txtSup.setEditable(false); 
    txtSup.setText("SUP"); 
    txtSup.setBounds(453, 95, 32, 23); 
    this.contentPane.add(txtSup); 

    // Checkbox 1st row 
    addCheckBox(183, 143, 23, 23, txtTop); 
    addCheckBox(255, 143, 23, 23, txtMid); 
    addCheckBox(322, 143, 23, 23, txtJng); 
    addCheckBox(393, 143, 23, 23, txtAdc); 
    addCheckBox(457, 143, 23, 23, txtSup); 

    // Checkbox 2nd row 
    addCheckBox(183, 200, 23, 23, txtTop); 
    addCheckBox(255, 200, 23, 23, txtMid); 
    addCheckBox(322, 200, 23, 23, txtJng); 
    addCheckBox(393, 200, 23, 23, txtAdc); 
    addCheckBox(457, 200, 23, 23, txtSup); 

    // Checkbox 3nd row 
    addCheckBox(183, 257, 23, 23, txtTop); 
    addCheckBox(255, 257, 23, 23, txtMid); 
    addCheckBox(322, 257, 23, 23, txtJng); 
    addCheckBox(393, 257, 23, 23, txtAdc); 
    addCheckBox(457, 257, 23, 23, txtSup); 
} 


private void addCheckBox(final int x, final int y, final int width, final int height, final JTextArea txtTop) 
{ 
    final JCheckBox checkBox = new JCheckBox(); 
    checkBox.setBounds(x, y, width, height); 
    checkBox.addItemListener(new FontChanger(txtTop)); 
    this.contentPane.add(checkBox); 
} 

class FontChanger implements ItemListener 
{ 
    private JTextArea textArea; 

    public FontChanger(final JTextArea textArea) 
    { 
     this.textArea = textArea; 
    } 

    @Override 
    public void itemStateChanged(final ItemEvent e) 
    { 
     if (e.getStateChange() == ItemEvent.SELECTED) 
     { 
      final Font boldFont = this.textArea.getFont().deriveFont(Font.BOLD); 
      this.textArea.setForeground(Color.RED); 
      this.textArea.setFont(boldFont); 
     } 
     else 
     { 
      final Font boldFont = this.textArea.getFont().deriveFont(Font.PLAIN); 
      this.textArea.setForeground(Color.BLACK); 
      this.textArea.setFont(boldFont); 
     } 
    } 
} 

}

ответ

0

Есть несколько способов достижения того, что вы хотите, чтобы попытаться сделать, но я считаю, что вопрос более концептуально. Каждый флажок что вы добавили в свою панель, есть свой * собственный * FontChanger. Каждый из этих FontChangers не знает других FontChangers или флажков. Что вы, , могли бы, вместо этого должны иметь один FontChanger, добавленный ко всем флажкам и тогда есть способ letti ng ваш единственный FontChanger знает состояние каждого флажка в методе itemStateChanged(). Таким образом, вы можете проверить, есть ли/сколько /, какой флажок установлен, и действовать по этому поводу.

EDIT: Вот полный пример (Примечание. Я активно модифицировал ваш код и не тестировал его, это просто для того, чтобы дать вам общее представление. Также я избавился от большинства конечных ключевых слов для кода читабельность, кроме того, если у вас нет конкретной причины использовать другой поток для запуска вашей программы, нет необходимости запускать ваш WindowBuilderTest в новом Runnable(), см. комментарий).

import java.awt.Color; 
import java.util.*; 

public class WindowBuilderTest extends JFrame 
{ 

private JPanel contentPane; 
private FontChanger fChanger; //<--NEW 
private JTextArea txtTop; //<--NEW 
private List<CheckBox> checkBoxes; //<--NEW 

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

    //just use this and comment out the whole Eventqueue block. 
    /* 
    WindowBuilderTest frame = new WindowBuilderTest(); 
    frame.setVisible(true); 
    */ 
} 

// Creating Frame 
public WindowBuilderTest() 
{ 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 1280, 720); 
    this.contentPane = new JPanel(); 
    this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(this.contentPane); 
    this.contentPane.setLayout(null); 

    // Create Font 
    Font headfont = new Font("Serif", Font.PLAIN, 15); 
    Font headfontRed = new Font("Serif", Font.PLAIN, 15); 

    // Role Headlines 
    txtTop = new JTextArea(); //<--NEW 
    fChanger = new FontChanger(txtTop); //<--NEW 
    checkBoxes = new ArrayList<CheckBox>(); //<-- NEW you will need to update your imports. 

    txtTop.setEditable(false); 
    txtTop.setText("TOP"); 
    txtTop.setBounds(180, 95, 32, 23); 
    this.contentPane.add(txtTop); 

    final JTextArea txtMid = new JTextArea(); 
    txtMid.setEditable(false); 
    txtMid.setText("MID"); 
    txtMid.setBounds(252, 95, 32, 23); 
    this.contentPane.add(txtMid); 

    final JTextArea txtJng = new JTextArea(); 
    txtJng.setEditable(false); 
    txtJng.setText("JNG"); 
    txtJng.setBounds(320, 95, 32, 23); 
    this.contentPane.add(txtJng); 

    final JTextArea txtAdc = new JTextArea(); 
    txtAdc.setEditable(false); 
    txtAdc.setText("ADC"); 
    txtAdc.setBounds(389, 95, 32, 23); 
    this.contentPane.add(txtAdc); 

    final JTextArea txtSup = new JTextArea(); 
    txtSup.setEditable(false); 
    txtSup.setText("SUP"); 
    txtSup.setBounds(453, 95, 32, 23); 
    this.contentPane.add(txtSup); 

    // Checkbox 1st row 
    addCheckBox(183, 143, 23, 23, txtTop); 
    addCheckBox(255, 143, 23, 23, txtMid); 
    addCheckBox(322, 143, 23, 23, txtJng); 
    addCheckBox(393, 143, 23, 23, txtAdc); 
    addCheckBox(457, 143, 23, 23, txtSup); 

    // Checkbox 2nd row 
    addCheckBox(183, 200, 23, 23, txtTop); 
    addCheckBox(255, 200, 23, 23, txtMid); 
    addCheckBox(322, 200, 23, 23, txtJng); 
    addCheckBox(393, 200, 23, 23, txtAdc); 
    addCheckBox(457, 200, 23, 23, txtSup); 

    // Checkbox 3nd row 
    addCheckBox(183, 257, 23, 23, txtTop); 
    addCheckBox(255, 257, 23, 23, txtMid); 
    addCheckBox(322, 257, 23, 23, txtJng); 
    addCheckBox(393, 257, 23, 23, txtAdc); 
    addCheckBox(457, 257, 23, 23, txtSup); 
} 


private void addCheckBox(int x, int y, int width, int height) 
{ 
    JCheckBox checkBox = new JCheckBox(); 
    checkBoxes.add(checkBox); // <-- NEW (add to checkboxes list) 
    checkBox.setBounds(x, y, width, height); 
    checkBox.addItemListener(fChanger); // <-- NEW (add the same listener to all) 
    this.contentPane.add(checkBox); 
} 

class FontChanger implements ItemListener 
{ 
    private JTextArea textArea; 

    public FontChanger(JTextArea textArea) 
    { 
     this.textArea = textArea; 
    } 

    @Override 
    public void itemStateChanged(ItemEvent e) 
    { 
     if (e.getStateChange() == ItemEvent.SELECTED) 
     { 
      Font boldFont = this.textArea.getFont().deriveFont(Font.BOLD); 
      this.textArea.setForeground(Color.RED); 
      this.textArea.setFont(boldFont); 
     } 
     else 
     { 
      //iterate through list of checkboxes to see if there's still one selected. 
      boolean stillOneCheckBoxSelected = false; 
      for(int i = 0; i < checkBoxes.size(); i++){ 
       if(checkBoxes.get(i).isSelected()){ // <- Verify the method here, not sure 
        stillOneCheckBoxSelected = true; 
        break; 
       } 
      } 
      if(!stillOneCheckBoxSelected){//if no check boxes are selected, reset 
       Font boldFont = this.textArea.getFont().deriveFont(Font.PLAIN); 
       this.textArea.setForeground(Color.BLACK); 
       this.textArea.setFont(boldFont); 
      } 
     } 
    } 
} 

Опять же, я не проверял это, возможно, придется латать вещи, но я думаю, что вы можете продолжать здесь. Вот ссылка на JavaDoc для ArrayLists, вы можете проконсультироваться, что: ArrayList JavaDoc

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

+0

Спасибо за ваш ответ :) Я понимаю общую концепцию, но я не уверен, насколько хорошо я смогу реализовать ее самостоятельно. Не могли бы вы помочь мне, дав мне приблизительную отправную точку? – Gomox

+0

Ваш класс WindowBuilderTest должен иметь переменную 'private FontChanger fChanger;'. В начале вашего конструктора вы затем создаете экземпляр переменной следующим образом: '..// Role Headlines final JTextArea txtTop = new JTextArea(); fChanger = new FontChanger (txtTop); .. ' Затем вы добавляете свои флажки с тем же методом addCheckBox(), но вместо этого ваш метод будет выглядеть так: ' private void addCheckBox [..] final JCheckBox checkBox = новый JCheckBox(); checkBox.setBounds (x, y, ширина, высота); checkBox.addItemListener (fChanger); .. ' Затем измените элемент itemStateChanged(). – schwarz

+0

Если это еще не ясно, я могу обновить свой предыдущий ответ более подробно. – schwarz

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