2013-09-08 3 views
1

Я просто новичок, и у меня возникла проблема с реализацией прослушивателя элементов как внутреннего класса.ItemListener для JCheckBox не работает

Что я хочу, так это то, что если кто-то выберет флажок t1, текст над ним, написанный в TextArea txtTop, станет полужирным.

Однако Eclipse говорит мне, что с моим слушателем существует множество проблем.

  1. Он хочет, чтобы я объявлял t1 и txtTop окончательным.
  2. Он хочет, чтобы я не делал класс слушателя закрытым.
  3. В любом случае, он не находит слушателя. Строка t1.addItemListener(new cl()); не работает.

Так что да, я не знаю, что делать. Надеюсь, один из вас может помочь мне! :)

Вот код:

import java.awt.BorderLayout; 


public class WindowBuilderTest extends JFrame 
{ 

private JPanel contentPane; 


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


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


    // Create Font 
    Font headfont = 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); 
    txtTop.setFont(headfont); 
    contentPane.add(txtTop); 

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

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

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

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

    // Checkbox 1st row 
    final JCheckBox t1 = new JCheckBox(""); 
    t1.setBounds(183, 143, 23, 23); 
    t1.addItemListener(new cl()); 
    contentPane.add(t1); 

    JCheckBox m1 = new JCheckBox(""); 
    m1.setBounds(255, 143, 23, 23); 
    contentPane.add(m1); 

    JCheckBox j1 = new JCheckBox(""); 
    j1.setBounds(322, 143, 23, 23); 
    contentPane.add(j1); 

    JCheckBox a1 = new JCheckBox(""); 
    a1.setBounds(393, 143, 23, 23); 
    contentPane.add(a1); 

    JCheckBox s1 = new JCheckBox(""); 
    s1.setBounds(457, 143, 23, 23); 
    contentPane.add(s1); 


    class cl implements ItemListener 
    { 
     @Override 
     public void itemStateChanged(ItemEvent e) 
     { 
      if(t1.isSelected()) 
      { 
       //Font headfont = txtTop.getFont().deriveFont(Font.BOLD, 40); 
       //txtTop.setFont(headfont); 
       System.out.println("HURRA!"); 
      } 
      else 
      { 
       //Font headfont = txtTop.getFont().deriveFont(Font.PLAIN, 40); 
       //txtTop.setFont(headfont); 
       System.out.println("JUHU!"); 
      } 

     } 
    } 



} 


} 

ответ

1

Это работает для вас:

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 

import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.border.EmptyBorder; 

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); 

     // Role Headlines 
     final JTextArea txtTop = new JTextArea(); 
     txtTop.setEditable(false); 
     txtTop.setText("TOP"); 
     txtTop.setBounds(180, 95, 32, 23); 
     txtTop.setFont(headfont); 
     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); 
    } 

    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 BoldChanger(txtTop)); 
     this.contentPane.add(checkBox); 
    } 

    class BoldChanger implements ItemListener 
    { 
     private JTextArea textArea; 

     public BoldChanger(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); 
      } 
     } 
    } 
} 

следующие проблемы, которые вы имели:

  • Innerclasses определения не допускаются внутри метода (вам пришлось переместить его)
  • Последнее мнение верное, если вы работайте с любыми классными классами (те, которые вы определяете как это ActionListener listner = new ActionListner{ ...}. Если у вас есть такой класс, вы можете получить доступ к переменной-члену.

Я переименовал ваш ItemListner в BoldChanger. Он получает TextArea для изменения в конструкторе.

Btw:

  • CARRY
  • джанглер ТОЛЬКО
  • БАК
  • ПОДДЕРЖКА
+0

Awesome! :) Я попробую это немедленно. Спасибо за объяснения особенно! – Gomox

+0

Вы также можете использовать методы для создания своих компонентов. Я сделал это с помощью флажков для вас. Вы также должны взглянуть на GridLayout – d0x

+0

Звучит интересно - я посмотрю на него :) BTW: Почему «окончательное» утверждение перед каждым требованием TextArea? – Gomox