Создание цвета JSlider для выбора цвета заливки прямоугольника
Задание заключается в создании выбора цвета. Почему при перемещении ползунка цвет не меняется? Я должен использовать JSlider
чтобы сделать цвет заливки прямоугольника.
Первоначальный запрос был:
(Создание средства выбора цвета) Объявить подкласс
JPanel
называетсяMyColorChooser
это обеспечивает триJSlider
объекты и триJTextField
объекты. каждыйJSlider
представляет значения от 0 до 255 для красной, зеленой и синей частей цвета. Используйте эти значения в качестве аргументов конструктора Color для создания нового объекта Color. Показать текущее значение каждогоJSlider
в соответствующемJTextField
, Когда пользователь изменяет значениеJSlider
,JTextField
должны быть изменены соответственно. Используйте ваш новый компонент GUI как часть приложения, которое отображает текущийColor
значение путем рисования заполненного прямоугольника.
package creatingacolorchooser;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
/**
*
* @author ian20
*/
public class MyColorChooser extends JPanel
{
private JLabel redLabel;
private JLabel greenLabel;
private JLabel blueLabel;
private JTextField redText;
private JTextField greenText;
private JTextField blueText;
private JSlider redSlider;
private JSlider greenSlider;
private JSlider blueSlider;
/**
* Constructor
*/
public MyColorChooser()
{
//Create FlowLayout manager.
setLayout(new FlowLayout());
//Create message Labels
redLabel = new JLabel("Red: ");
greenLabel = new JLabel("Green: ");
blueLabel = new JLabel("Blue: ");
//Create read only text fields.
redText = new JTextField("0", 5);
greenText = new JTextField("0", 5);
blueText = new JTextField("0", 5);
//Create JSlider
redSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
redSlider.setPreferredSize(new Dimension(1000,75));
redSlider.setMajorTickSpacing(10);
redSlider.setMinorTickSpacing(1);
redSlider.setPaintTicks(true);
redSlider.setPaintLabels(true);
redSlider.addChangeListener(new RedSlideListener());
greenSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
greenSlider.setPreferredSize(new Dimension(1000,75));
greenSlider.setMajorTickSpacing(10);
greenSlider.setMinorTickSpacing(1);
greenSlider.setPaintTicks(true);
greenSlider.setPaintLabels(true);
greenSlider.addChangeListener(new GreenSlideListener());
blueSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
blueSlider.setPreferredSize(new Dimension(1000,75));
blueSlider.setMajorTickSpacing(10);
blueSlider.setMinorTickSpacing(1);
blueSlider.setPaintTicks(true);
blueSlider.setPaintLabels(true);
blueSlider.addChangeListener(new BlueSlideListener());
//
add(redLabel);
add(redSlider);
add(redText);
add(greenLabel);
add(greenSlider);
add(greenText);
add(blueLabel);
add(blueSlider);
add(blueText);
}
/**
* Private inner class to handle the the change events that are
* generated when the slider is moved
*/
private class RedSlideListener implements ChangeListener
{
public void stateChanged(ChangeEvent e)
{
int redInt;
//get slider value
redInt = redSlider.getValue();
//Create object and set value.
RectPanel rp = new RectPanel();
rp.setRed(redInt = redSlider.getValue());
//Display slider value in text field.
redText.setText(Integer.toString(redInt));
}
}
/**
* Private inner class to handle the the change events that are generated
* when the slider is moved
*/
private class GreenSlideListener implements ChangeListener
{
public void stateChanged(ChangeEvent e)
{
int greenInt;
//get slider value
greenInt = greenSlider.getValue();
//Create object and set value.
RectPanel rp = new RectPanel();
rp.setGreen(greenInt = greenSlider.getValue());
//Display slider value in text field.
greenText.setText(Integer.toString(greenInt));
}
}
/**
* Private inner class to handle the the change events that are generated
* when the slider is moved
*/
private class BlueSlideListener implements ChangeListener
{
public void stateChanged(ChangeEvent e)
{
int blueInt;
//get slider value
blueInt = blueSlider.getValue();
//Create object and set value.
RectPanel rp = new RectPanel();
rp.setBlue(blueInt = blueSlider.getValue());
//Display slider value in text field.
blueText.setText(Integer.toString(blueInt));
}
}
}
enter code here
package creatingacolorchooser;
import java.awt.Color;
import javax.swing.*;
import java.awt.Graphics;
/**
*
* @author ian20
*/
public class RectPanel extends JPanel
{
private int red;
private int blue;
private int green;
/**
* The setRed method sets int red to a int value.
* @param r
*/
public void setRed(int r)
{
red = r;
}
/**
* The setBlue method sets int blue to a int value.
* @param r
*/
public void setBlue(int b)
{
blue = b;
}
/**
* The setGreen method sets int Green to a int value.
* @param r
*/
public void setGreen(int g)
{
green = g;
}
/**
* The getRed method returns int value called red.
* @return
*/
public int getRed()
{
return red;
}
/**
* The getBlue method returns int value called blue.
* @return
*/
public int getBlue()
{
return blue;
}
/**
* The getGreen method returns int value called blue.
* @return
*/
public int getGreen()
{
return green;
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
RectPanel rp = new RectPanel();
g.setColor(new Color(rp.getRed(),rp.getBlue(),rp.getGreen()));
g.fillRect(475, 50, 200, 200);
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package creatingacolorchooser;
import java.awt.GridLayout;
import javax.swing.JFrame;
/**
*
* @author ian20
*/
public class MainColor
{
public static void main(String[] args)
{
JFrame frame = new JFrame("Change Rectangle Color");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
RectPanel rect = new RectPanel();
rect.repaint();
MyColorChooser mcc = new MyColorChooser();
frame.setLayout(new GridLayout(2, 1));
frame.add(rect);
frame.add(mcc);
frame.setSize(1150, 600);
frame.setVisible(true);
}
}
Единственная часть кода, которая не работает так, как я хочу, это то, что слайдер не влияет на setColor
,
Я изменил вещи вокруг, и, кажется, работает, любые комментарии будут оценены.
/*
* Class MyColorChooser holds sliders affecting text fields, labels, and a
* graphic affected by the position of the sliders.
*/
package creatingacolorchooser;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.*;
import java.awt.Graphics;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
*
* @author ian20
*/
public class MyColorChooser extends JPanel
{
private int red; //Holds int value as red.
private int green; //Holds int value as green.
private int blue; //Holds int value as blue.
private JLabel redLabel; //Holds red color label
private JLabel greenLabel; //Holds blue color label
private JLabel blueLabel; //Holds green color label
private JTextField redText; //Holds numerical value of red colod
private JTextField greenText; //Holds numerical value of green colod
private JTextField blueText; //Holds numerical value of blue colod
private JSlider redSlider; //Holds the red JSlider
private JSlider greenSlider; //Holds the green JSlider
private JSlider blueSlider; //Holds the blue JSlider
public MyColorChooser()
{
//Create layout
setLayout(new FlowLayout());
//Create labels
redLabel = new JLabel("Red: ");
greenLabel = new JLabel("Green: ");
blueLabel = new JLabel("Blue: ");
//Create read only text fields.
redText = new JTextField("0", 5);
redText.setEditable(false);
greenText = new JTextField("0", 5);
greenText.setEditable(false);
blueText = new JTextField("0", 5);
blueText.setEditable(false);
//Create JSlider
redSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
redSlider.setPreferredSize(new Dimension(1000,75));
redSlider.setMajorTickSpacing(10);
redSlider.setMinorTickSpacing(1);
redSlider.setPaintTicks(true);
redSlider.setPaintLabels(true);
redSlider.addChangeListener(new ColorSlideListener());
greenSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
greenSlider.setPreferredSize(new Dimension(1000,75));
greenSlider.setMajorTickSpacing(10);
greenSlider.setMinorTickSpacing(1);
greenSlider.setPaintTicks(true);
greenSlider.setPaintLabels(true);
greenSlider.addChangeListener(new ColorSlideListener());
blueSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
blueSlider.setPreferredSize(new Dimension(1000,75));
blueSlider.setMajorTickSpacing(10);
blueSlider.setMinorTickSpacing(1);
blueSlider.setPaintTicks(true);
blueSlider.setPaintLabels(true);
blueSlider.addChangeListener(new ColorSlideListener());
//Add components to the panel
add(redLabel);
add(redSlider);
add(redText);
add(greenLabel);
add(greenSlider);
add(greenText);
add(blueLabel);
add(blueSlider);
add(blueText);
}
/**
* Private inner class to handle the the change events that are generated
* when the slider is moved
*/
private class ColorSlideListener implements ChangeListener
{
public void stateChanged(ChangeEvent e)
{
//get slider value
red = redSlider.getValue();
green = greenSlider.getValue();
blue = blueSlider.getValue();
//Display slider value in text field.
redText.setText(Integer.toString(red));
greenText.setText(Integer.toString(green));
blueText.setText(Integer.toString(blue));
//Set rectangle color.
repaint();
}
}
/**
* The paintComponent creates a rectangle with adjustable coloring
* @param g
*/
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(new Color(red, green, blue));
g.fillRect(420, 300, 300, 100);
}
}
/*
* The MainColor creates the GUI for the Selected RectPanel application.
*/
package creatingacolorchooser;
import java.awt.GridLayout;
import javax.swing.JFrame;
/**
*
* @author ian20
*/
public class MainColor
{
public static void main(String[] args)
{
//Create frame object
JFrame frame = new JFrame("Change Rectangle Color");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create rect object
MyColorChooser mcc = new MyColorChooser();
//Add to the frame, set layout, set size, and make it viable.
frame.setLayout(new GridLayout(1, 1));
frame.add(mcc);
frame.setSize(1150, 500);
frame.setVisible(true);
}
}
1 ответ
Это ничего не делает для использования:
RectPanel rp = new RectPanel();
rp.setRed(redInt = redSlider.getValue());
когда вы создаете новую JPanel, меняете ее свойства и нигде не отображаете. Вместо этого вы должны изменить состояние уже отображенной RectPanel JPanel, а не создавать новое. Это означает, что ссылка на то, какой цвет JPanel должен быть изменен, должна быть передана в ваш объект выбора цвета, чтобы его состояние (цвет) можно было изменить.
Также не следует создавать RectPanel в методе paintComponent.
Ваша проблема равносильна тому, что вы приобрели синий Ford Mustang, затем вы отправляетесь в автомобильный магазин, покупаете новый Ford Mustang, окрашиваете его в зеленый цвет, а затем удивляетесь, почему оригинальный Mustang по-прежнему синий, и эта проблема проистекает из фундаментальной путаницы что такое объекты и как они работают. Каждый раз, когда вы вызываете конструктор класса с помощью оператора new, понимайте, что вы создаете совершенно новый и уникальный экземпляр этого типа объекта, и этот экземпляр полностью независим от других экземпляров, которые могли быть созданы ранее.
Я создал рабочий пример, но не собираюсь публиковать здесь все, так как мы не делаем домашнюю работу, но я опубликую ее часть. Обратите внимание, что я создал одну JPanel для использования с 3 разными цветами, которая называется ColorSliderPanel. Я также назвал свой рисунок JPanel MyColorPanel.
Части ColorSliderPanel выглядят так:
public class ColorSliderPanel extends JPanel {
private static final int MAX_COLOR = 255;
private Color color;
private JSlider slider = new JSlider(0, MAX_COLOR, 0);
private JTextField textField = new JTextField("0", 5);
private MyColorPanel myColorPanel;
// here is the key, my constructor takes MyColorPanel reference
public ColorSliderPanel(String text, Color color, MyColorPanel myColorPanel) {
this.color = color;
this.myColorPanel = myColorPanel; // and then sets the field of the class
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(1);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.addChangeListener(new SliderListener());
// .....
setBorder(BorderFactory.createTitledBorder(text));
// .....
}
private class SliderListener implements ChangeListener {
@Override
public void stateChanged(ChangeEvent cEvt) {
int newValue = slider.getValue();
// call getColor() on the original MyColorPanel object
Color origClr = myColorPanel.getColor(); // get the original color
textField.setText("" + newValue);
// here we decide what the new color's r,g,b should be----
// ......
Color newColor = new Color(r, g, b);
// set the color of the original MyColorPanel object
myColorPanel.setColor(newColor);
}
}
}
Части MyColorPanel. Обратите внимание, что я даю это getColor()
а также setColor(Color color)
методы, но вы можете использовать свои индивидуальные красные / синие / зеленые геттеры / сеттеры, если хотите:
public class MyColorPanel extends JPanel {
private static final Color INIT_COLOR = Color.BLACK;
private static final int RECT_WIDTH = 200;
private Color color = INIT_COLOR;
// ...
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
int rectX = (getWidth() - RECT_WIDTH) / 2;
int rectY = (getHeight() - RECT_WIDTH) / 2;
g.fillRect(rectX, rectY, RECT_WIDTH, RECT_WIDTH);
}
}
Основной GUI подключил все вместе так:
public class MyColorFoo extends JPanel {
private MyColorPanel myColorPanel = new MyColorPanel(1000, 400);
public MyColorFoo() {
JPanel slidersPanel = new JPanel(new GridLayout(0, 1, 3, 3));
slidersPanel.add(new ColorSliderPanel("Red", Color.RED, myColorPanel));
slidersPanel.add(new ColorSliderPanel("Green", Color.GREEN, myColorPanel));
slidersPanel.add(new ColorSliderPanel("Blue", Color.BLUE, myColorPanel));
setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
setLayout(new BorderLayout(3, 3));
add(myColorPanel, BorderLayout.CENTER);
add(slidersPanel, BorderLayout.PAGE_END);
}