JCheckBox的ItemListener不起作用

时间:2013-09-08 15:31:06

标签: java swing inner-classes jcheckbox itemlistener

我只是一个初学者,我在将项目监听器实现为内部类时遇到了问题。

我想要发生的是,如果有人选中了t1复选框,那么用TextArea txtTop编写的文本就会变为粗体。

但是,Eclipse告诉我,我的监听器存在多个问题。

  1. 它要我将t1和txtTop声明为final。
  2. 它希望我不要将监听器类设为私有。
  3. 无论如何都找不到听众。第t1.addItemListener(new cl());行不起作用。
  4. 所以是的,我不知道该怎么做。希望你们中的一个可以帮助我! :)

    以下是代码:

    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 个答案:

答案 0 :(得分: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);
            }
        }
    }
}

遇到以下问题:

  • 方法内部不允许使用内部类定义(必须将其移出)
  • 如果你使用任何一个类(你定义的那个类,如ActionListener listner = new ActionListner{ ...}),最后的想法是正确的。如果你有这样的类,你可以访问成员变量。

我将您的ItemListner重命名为BoldChanger。它使TextArea在构造函数中更改。

顺便说一下:

  • <击> CARRY
  • JUNGLER ONLY
  • <击> TANK
  • <击>支持