内部クラスのイベント処理メソッドを介して外部クラスのメンバーを操作しようとしています。
クラスMyColorChooser
にはプライベート メンバーがありsliderColor
ます。のデフォルト値はsliderColor
、コンストラクターで黒に設定されます。
からのユーザー入力による新しい色の構築を処理するために、内部クラスが使用されますJSliders
。sliderColor
次に、外側のクラスのセッター メソッドを介して、この新しい色の値を設定します。
getColor
問題は、外部クラスのインスタンスが、割り当てられた新しい値ではなく、コンストラクターによって設定された値 (黒) を常に返す独自のメソッドを使用することです。内部クラスのメソッドが外部メンバー変数の値を直接変更できるようにするにはどうすればよいですか?
更新しました
はい、それは機能しているように見えますが、なぜそうではないのか困惑しました...コードの関連ビットであると私が信じているもののいくつかを投稿しました:
NB 挿入する量がわからないため、コードが不適切な場合は事前にお詫びします....
デバッグ:私はデバッグし、色が内部クラスとsetColour外部クラスメソッドにあるはずの色であることを指摘しました...変更されたのではないかと疑っていますデフォルトのコンストラクター値に戻ります...どこで、または何によってかわかりません...デバッグを続けるだけです
クラス MyColorChooser を使用すると、内部クラスのイベント ハンドラーによって処理される JSliders からの入力を介してカラー オブジェクトを作成できます。
* Part 4
* JPanel subclass that alloews the user define the color attributes for shapes
* utlising 3 JSliders
*/
package Assignment2;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
*
* @author Ciaran Mooney dancingbush@gmail.com
*/
public class MyColorChooser4 extends JPanel {
//declare instance varibles
//JSlider colors
private JSlider blueSlider;
private JSlider greenSlider;
private JSlider redSlider;
//display color chossen by user varibles
private JTextField redChoice;
private JTextField greenChoice;
private JTextField blueChoice;
private DrawPanel shapeColor = new DrawPanel(); //set color of drawpanel onbject
//prompts for user input
private JLabel redInput;
private JLabel blueInput;
private JLabel greenInput;
//color object created
private Color colorChoice ; ;
private JTextField theColor;
//no arg GUI construtor gets user input and constructs color
public MyColorChooser4() {
//default layout of panel is set to GridLayout 4 cols 4 rows
this.setLayout(new GridLayout(4, 4));
greenInput = new JLabel("Green: ");
greenSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 1);
greenChoice = new JTextField("0", 4);//default text
greenChoice.setEditable(false);
add(greenInput);
add(greenSlider);
add(greenChoice);
redInput = new JLabel("Red: ");
redSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 1);
redChoice = new JTextField("0", 4);//default text
redChoice.setEditable(false);
add(redInput);
add(redSlider);
add(redChoice);
blueInput = new JLabel("Blue: ");
blueSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 1);
blueChoice = new JTextField("0", 4);//default text
blueChoice.setEditable(false);
add(blueInput);
add(blueSlider);
add(blueChoice);
//set default color black and declare inner class event handlers
//sliders utlise ChengeListeners
greenSlider.addChangeListener(new SlideHandler());
redSlider.addChangeListener(new SlideHandler());
blueSlider.addChangeListener(new SlideHandler());
colorChoice = Color.RED;
//label to diplay color chosen, and blnk JLabel to move color to center
theColor = new JTextField(4);
JLabel preview = new JLabel(" ");
add(preview);
add(theColor);
theColor.setBackground(colorChoice);
}//end GUI constructor
//set color
public void setSlideColor(Color colorSlide) {
colorChoice = colorSlide;
}//end set colorChoice
//get methods for fields
public Color getColor() {
return colorChoice;
}//end getColor
//return slider for red value
public JSlider getRedSlider() {
return redSlider;
}//edn get red slider
//retirn slider for green value
public JSlider getGreenSlider() {
return greenSlider;
}//edn getGreenSlider
//return slider for blue value
public JSlider getBlueSlider() {
return blueSlider;
}//end getGreenSlider
//private inner class for event handliing on sliders & implement abstract class
private class SlideHandler implements ChangeListener {
private Color colorSlide;
@Override
public void stateChanged(ChangeEvent e) {
//return integers from sliders
int blue = blueSlider.getValue();
int green = greenSlider.getValue();
int red = redSlider.getValue();
//now construct a new color based on these values
colorSlide = new Color(red, green, blue);
setSlideColor(colorSlide);
//display integer value of color chosen in relative textfield
//use String method valueOf to return string rep of integer
//display chossen color in text area
redChoice.setText(String.valueOf(red));
redChoice.setBackground(new Color(red, 0, 0));
greenChoice.setText(String.valueOf(green));
greenChoice.setBackground(new Color(0, green, 0));
blueChoice.setText(String.valueOf(blue));
blueChoice.setBackground(new Color(0, 0, blue));
//set chosen color preview
theColor.setBackground(colorChoice);
theColor.setText("Preview");
}//end stateChanged method
}//end inner class SlideHandler
}//end class MyColorChooser4
次に、ユーザーが色を含む描画する形状のさまざまな属性を選択できるメニューであるクラス ShapePanel。色は、色オブジェクトの配列の JComobobox を介して選択されます。MyColorCHooser4 からの色は、その getColor メソッドを呼び出すクラスのインスタンスを介して取得されます。
上記の宣言と普及
public DrawPanel draw = new DrawPanel();
private MyColorChooser4 sliderColor = new MyColorChooser4();
//array holding color objects
private Color colors[] = {Color.BLACK, Color.BLUE, Color.CYAN,
Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY,
Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE,
Color.YELLOW, sliderColor.getColor()};
//array carrying color strings
private String colorNames[] = {"Black", "Blue", "Cyan",
"Dark Gray", "Gray", "Green", "Light Gray", "Magenta",
"Orange", "Pink", "Red", "White", "Yellow", "Slider Color"};
色の選択を可能にするクラス ShapePanel のイベント ハンドラ メソッド....
color = new JComboBox(colorNames);
color.setMaximumRowCount(6);
color.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
draw.setCurrentColor((colors[color.getSelectedIndex()]));;
} //end if
}//end itemStateChnaged
});//end annmonouys class and action event method
componments.add(color);
クラス DrawPanel のインスタンス draw は、次の set メソッドを介してシェイプが描画される色を設定します.....
//set current color
public void setCurrentColor(Color color) {
//set currentColor from JCombox input handler
currentColor = color;
//generate a random startColor for Gradient color
int red = (int) (Math.random() * 256);
int green = (int) (Math.random() * 256);
int blue = (int) (Math.random() * 256);
//cyclic vs acylic fill
colorFillStyle = new Random();
boolean gradientShift = colorFillStyle.nextBoolean();
//create gradient object
Color startColor = new Color(red, green, blue);
gradientColor = new GradientPaint(10f, 10f, startColor, 350f, 350f, currentColor, gradientShift);
}//end set color method
ただし、形状が描画されるとき、色は常に赤で、MyColorChooser4 コンストラクターの色の intilization 値を反映しています....
うまくいけば、これは多少役に立ちます......