【问题标题】:ItemListener for JCheckBox doesn't workJCheckBox 的 ItemListener 不起作用
【发布时间】:2013-09-08 15:31:05
【问题描述】:

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

我想要发生的是,如果有人选中复选框 t1,则其上方的文本(写入 TextArea txtTop)会变为粗体。

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

  1. 它要我将 t1 和 txtTop 声明为 final。
  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!");
            }

        }
    }



}


}

【问题讨论】:

    标签: java swing inner-classes jcheckbox itemlistener


    【解决方案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。

    顺便说一句:

    • 携带
    • 仅限丛林
    • 坦克
    • 支持

    【讨论】:

    • 太棒了! :) 我会立即尝试。特别感谢您的解释!
    • 你也可以使用方法来创建你的组件。我用复选框为你做到了。您还应该看看 GridLayout
    • 听起来很有趣 - 我会看看 :) 顺便说一句:为什么需要在每个 TextArea 之前的“最终”声明?
    • 如果解决方案适合您,请您接受答案吗? (或告诉我缺少什么:))
    • 还有一个问题:我怎样才能改变颜色(变成红色)而不是加粗?我想我必须更改这一行:final Font boldFont = this.textArea.getFont().deriveFont(Font.BOLD);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多