我尝试了来自不同站点的代码,也尝试了来自一个颜色的代码。我如何使色彩选择器与jmenu项目一起工作?

我查看了ColorChooser ExampleOracle Color Chooser Example,然后使用以下代码将其实现到原始类中:

   JMenuItem clr = new JMenuItem("Font Color");
    clr.addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent e)
        {
            ColorChooserDemo ccd = new ColorChooserDemo();
            ccd.setVisible(true);
        }
    });


但是,当我按菜单项时,这似乎无能为力。

该类代码来自oracle网页。这些是我使用的以下课程(当然是眼前的问题的简称)。我正在做一个记事本程序,因为我要重新开始编程并刷新关于如何在Java中执行操作的记忆。当前的问题是,当我单击jmenuitem clr(这是字体颜色)时,无法显示颜色选择器,到目前为止,以下代码显示了我所拥有的:

颜色选择器类别:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.colorchooser.*;

/* ColorChooserDemo.java requires no other files. */
@SuppressWarnings("serial")
public class ColorChooserDemo extends JPanel
                              implements ChangeListener {

    protected JColorChooser tcc;
    protected JLabel banner;

    public ColorChooserDemo() {
        super(new BorderLayout());

        //Set up color chooser for setting text color
        tcc = new JColorChooser();
        tcc.getSelectionModel().addChangeListener(this);
        tcc.setBorder(BorderFactory.createTitledBorder(
                                             "Choose Text Color"));

        add(tcc, BorderLayout.PAGE_END);
    }

    public void stateChanged(ChangeEvent e) {
        Color newColor = tcc.getColor();
        FirstWindow.ta1.setForeground(newColor);
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("ColorChooserDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        JComponent newContentPane = new ColorChooserDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}


主类:

导入java.awt.EventQueue;

public class Main{
    protected static Object fw;

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try
                {
                    FirstWindow fw = new FirstWindow();
                    fw.setVisible(true);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }

            }

        });
    }
}


FirstWindow类:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;


public class FirstWindow extends JFrame {
    private static final long serialVersionUID = 1L;
    protected JColorChooser tcc;
    protected static JTextArea ta1;

    public FirstWindow() {
        super("Note Pad");

        Font font = new Font("Verdana", Font.BOLD, 12);

        //Setting the size of the note pad
        setSize(650, 745);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        //Create the MenuBar
        JMenuBar mb = new JMenuBar();
        setJMenuBar(mb);

        //Create the panel to hold everything in
        JPanel p = new JPanel();

        //Create the Text Area
        final JTextArea ta1 = new JTextArea();
        ta1.setFont(font);
        ta1.setMargin(new Insets(5,5,5,5));
        ta1.setLineWrap(true);
        ta1.setWrapStyleWord(true);

        //Create the Scroll Pane to hold the Text Area
        final JScrollPane sp = new JScrollPane(ta1);
        sp.setPreferredSize(new Dimension(625,675));
        sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

        //Create the menu's
        JMenu format = new JMenu("Format");

            //Create menu item for picking font color
        JMenuItem clr = new JMenuItem("Font Color");
        clr.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e)
            {
                ColorChooserDemo ccd = new ColorChooserDemo();
                ccd.setVisible(true);
            }
        });

        //adding the menu items to the file menu tab

        //adding menu items to the edit tab

        //adding menu items to the format tab
        format.add(clr);

        //adding the menus to the menu bar
        mb.add(format);


        //adding the scroll pane to the panel
        p.add(sp);
        add(p, BorderLayout.CENTER);

    }
}

最佳答案

显示ColorChooser的最简单方法可能是以下方法:

在ColorChooserDemo类中,您具有方法private static void createAndShowGUI(),应将其声明为public。

然后,将菜单项的ActionListener替换为以下内容:

    clr.addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent e)
        {
            ColorChooserDemo.createAndShowGUI();
        }
    });


您的ColorChooserDemo类扩展了JPanel,而不是JFrame。您首先需要一个JFrame,然后添加面板,然后显示JFrame。这就是createAndShowGUI()方法中发生的情况。

编辑:
我知道您只想知道选择菜单项时如何显示ColorChooserDemo。

但是,要实际设置颜色,您可能要跳过使用自己的ColorChooserDemo类,并用以下代码替换ActionListener代码:

    clr.addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent e)
        {
            Color c = JColorChooser.showDialog(ta1, "ColorChooserDemo", null);
            ta1.setForeground(c);
        }
    });

09-25 22:05