Использование JComboBox для установки цвета нарисованного графика - PullRequest
0 голосов
/ 22 августа 2011

Я создал симуляцию, которая выполняет ряд вычислений, а затем сохраняет точку, состоящую из координат x и y, в список массивов точек.

Затем у меня есть цикл for, который перебирает каждую точку и рисует эту точку в графическом интерфейсе.Вот мой цикл for, который выполняется в конце симуляции и метод drawPoint:

//Iterates through each point in Point Array List
for(Point i: PointArray)
 {
      drawPoint(g, i, black); //Draw Point
 }

//Draws point onto panel
public void drawPoint(Graphics g, Point PointArray, Color color)
{
     Graphics2D g2d = (Graphics2D)g;
     g2d.setStroke(new BasicStroke(2f));
     g.setColor(color); //g2d.setColor(Color.black); 
     g2d.drawOval((int)PointArray.a, (int)PointArray.b, 2, 2);
} 

Я хочу реализовать JComboBox, чтобы пользователь мог указать, какой цвет он хочет, чтобы график был окрашен при рисовании.,Я создал разные цветовые объекты для этого.

В моем методе actionPerformed у меня также есть код, который обрабатывает события JButton, которые запускают, останавливают и стирают симуляцию.Вот что у меня есть для моего метода actionPerformed:

 public void actionPerformed(ActionEvent e) 
 {
       Object source = e.getSource(); 

       JComboBox cb = (JComboBox)e.getSource();
       String colorName = (String)cb.getSelectedItem();

       //Get Graphics on Drawing Panel
       Graphics g = dPanel.getGraphics();

       //if JButton source == start, do something

       //if JButton source == stop, do something

       //If JButton source == erase, do something

       if(colorName == "Default")
       {
            g.setColor(black); 
       }

       if(colorName == "Red")
       {
            g.setColor(startColor); 
       }

       if(colorName == "Green")
       {
            g.setColor(forestGreen); 
       }
 }

Я получаю следующую ошибку: Исключение в потоке "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton не может быть приведенов javax.swing.JComboBox на SimulationGUI.actionPerformed (SimulationGUI.java:332)

Поэтому мой вопрос заключается в том, что я хочу сделать, даже если это возможно (и то, что моя реализация не работает)Каков был бы способ сделать это?

РЕДАКТИРОВАТЬ:

Вот мой новый слушатель действий для JComboBox:

    colorBox.addActionListener(new ActionListener()               
    {                                                         
        public void actionPerformed(ActionEvent e)               
        {                                                        
                 JComboBox cb = (JComboBox)e.getSource();
                 String colorName = (String)cb.getSelectedItem();

            Graphics g = dPanel.getGraphics();

            if(colorName.equals("Default"))
            {
                g.setColor(black);
            }

            if(colorName.equals("Red"))
            {
                g.setColor(startColor);
            }

            if(colorName.equals("Green"))
            {
                g.setColor(forestGreen);
            }

            if(colorName.equals("Blue"))
            {
                g.setColor(eraseColor);
            }                    
        }                                                        
    });
}

Ответы [ 2 ]

1 голос
/ 22 августа 2011

1) Не используйте метод getGraphics() для рисования.Может показаться, что работает, но попробуйте свернуть, а затем восстановить рамку, и картина исчезнет.Проверьте Пользовательские подходы к рисованию , чтобы узнать, как это сделать.

2) Не используйте "==" для сравнения значений String.Использование:

colorName.equals("Red");

На самом деле лучшим решением является сохранение пользовательского объекта ColorItem в поле со списком.Этот элемент будет хранить как отображаемый текст String, так и объект Color.Тогда нет необходимости в нескольких операторах if в ActionListener.Вот простой пример, который использует этот подход:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;

public class ComboBoxItem extends JFrame implements ActionListener
{
    public ComboBoxItem()
    {
        Vector model = new Vector();
        model.addElement( new Item(1, "car" ) );
        model.addElement( new Item(2, "plane" ) );
        model.addElement( new Item(4, "boat" ) );
        model.addElement( new Item(3, "train" ) );
        model.addElement( new Item(5, "boat" ) );

        JComboBox comboBox;

        //  Easiest approach is to just override toString() method
        //  of the Item class

        comboBox = new JComboBox( model );
        comboBox.setSelectedIndex(-1);

        comboBox.addActionListener( this );
//      comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
        getContentPane().add(comboBox, BorderLayout.NORTH );

        //  Most flexible approach is to create a custom render
        //  to diplay the Item data
        //  Note this approach will break keyboard navigation if you don't
        //  implement a default toString() method.

        comboBox = new JComboBox( model );
        comboBox.setSelectedIndex(-1);
        comboBox.setRenderer( new ItemRenderer() );
        comboBox.addActionListener( this );
        getContentPane().add(comboBox, BorderLayout.SOUTH );
    }

    public void actionPerformed(ActionEvent e)
    {
        JComboBox comboBox = (JComboBox)e.getSource();
        Item item = (Item)comboBox.getSelectedItem();
        System.out.println( item.getId() + " : " + item.getDescription() );
    }

    class ItemRenderer extends BasicComboBoxRenderer
    {
        public Component getListCellRendererComponent(
            JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus)
        {
            super.getListCellRendererComponent(list, value, index,
                isSelected, cellHasFocus);

            if (value != null)
            {
                Item item = (Item)value;
                setText( item.getDescription().toUpperCase() );
            }
/*
            if (index == -1)
            {
                Item item = (Item)value;
                setText( "" + item.getId() );
            }
*/

            return this;
        }
    }

    class Item
    {
        private int id;
        private String description;

        public Item(int id, String description)
        {
            this.id = id;
            this.description = description;
        }

        public int getId()
        {
            return id;
        }

        public String getDescription()
        {
            return description;
        }

        public String toString()
        {
            return description;
        }
    }

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxItem();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
     }

}
1 голос
/ 22 августа 2011

Используйте отдельные ActionListener для ComboBox и ваших кнопок.Прямо сейчас ваша главная проблема в том, что вы ведете здесь каст, ожидая JComboBox:

JComboBox cb = (JComboBox)e.getSource();

Но это не удастся при нажатии кнопки, потому что JButton не является JComboBox.Выполнение этого приведения было бы хорошо, если бы оно было в ActionListener, имеющем дело только с JComboBoxes.

...