单击JMenu项目的ColorChooser

时间:2013-12-13 05:22:16

标签: java oracle swing jmenuitem jcolorchooser

我尝试了来自不同网站的代码和一个来自这里的颜色代码。如何使用颜色选择器来处理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(这是字体颜色)时,我无法得到颜色选择器,下面的代码显示了我到目前为止的内容:

Color Chooser Class:

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

主类:

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

    }
}

2 个答案:

答案 0 :(得分:1)

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

在ColorChooserDemo类中,您有方法private static void createAndShowGUI(),您应该将其公开。

然后,将菜单项的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);
        }
    });

答案 1 :(得分:0)

安德鲁建议,SSCE不仅更容易让我们提供解决方案,而且还可以帮助您弄清楚并了解该怎么做。无论如何,这是一个在按下JMenuItem后打开颜色选择器的快速示例:

item.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        JColorChooser jColorChooser = new JColorChooser();

        JDialog jDialog = new JDialog();
        jDialog.setContentPane(jColorChooser);
        jDialog.pack();
        jDialog.setVisible(true);
    }
});

LE :(抱歉,我自己选择了新的选择器)或者只使用JColorChooser.showDialog()