1

内部クラスのイベント処理メソッドを介して外部クラスのメンバーを操作しようとしています。

クラスMyColorChooserにはプライベート メンバーがありsliderColorます。のデフォルト値はsliderColor、コンストラクターで黒に設定されます。

からのユーザー入力による新しい色の構築を処理するために、内部クラスが使用されますJSliderssliderColor次に、外側のクラスのセッター メソッドを介して、この新しい色の値を設定します。

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 値を反映しています....

うまくいけば、これは多少役に立ちます......

4

2 に答える 2

1

コードを見なければ、問題が何であるかを特定することは不可能ですが、いくつかの可能性があります。

1: 外部クラスの set メソッドが正しくありません。ありそうにないようですが、次のように書かれている可能性があるため、常に確認する価値があります。

public void setColor(Color color)
{
    // Should be this.color =
    color = color;
}

2: 内部クラスが外部クラスの set メソッドを呼び出していません。おそらく内部クラスは、呼び出しで優先される独自の set メソッドを宣言しています。

3: おそらくイベントがトリガーされていないため、内部クラスが実際に呼び出されることはありません。

最終的に、setMethod が呼び出されていないか、本来あるべきことを実行していないか、set メソッドを呼び出した後に別の何かが値をリセットしています。私が知る限り、値が期待どおりに設定されない理由については、これらが唯一の可能性です。

コードを投稿していただければ、問題に対するより具体的な回答を得ることができます。

于 2013-07-09T23:00:00.487 に答える
0

@increment1シングルトン戦術を回避し、1つのクラスですべてのインスタンスreqを作成することで必要なワットを取得し、リスナーをイベントハンドラーにアタッチすることで必要な変更を実現しました。.

私の問題は、drawPanel クラスの 2 つの別々のインスタンスから同じ動作を期待していたことでした。

またよろしくお願いします C

于 2013-07-12T15:02:09.703 に答える