1

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

我想要发生的是,如果有人选择了 checkbox 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!");
            }

        }
    }



}


}
4

1 回答 1

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。

顺便提一句:

  • 携带
  • 仅限丛林
  • 坦克
  • 支持
于 2013-09-08T15:43:03.813 回答