Java 如何将一个类的ChangeListener引用到另一个类?
我放弃所有这些代码,使用完全不同的代码>>> 不用再回答了 我从我的教授那里得到了一份家庭作业。他告诉我们使用4个类来制作applet绘画程序。 主要的光源面板;绘图板;调色板面板 (基本代码没有给出;只有类) 该程序将采取鼠标输入和绘制圆时,我做了一个圆线。根据光源的不同,圆圈将产生“发光效果”(使用JSlider作为光源)。滑动JSlider时,圆圈发光效果会实时更改 我在将LightSource事件侦听器引用到绘图时遇到问题,因此它会更改DrawingPanel内的“int light”。我不知道为什么JColorChooser中的引用可以工作,而这个不能 (它给了我java“非静态方法不能从静态引用”,我不能将其更改为静态,因为我需要调用repaint()方法) 这是我的第三次课堂作业,教授刚刚在一节课上教了我们基本的动作听者。所以我不知道我在做什么。如果可能的话,请详细解释我的错误 主要代码:Java 如何将一个类的ChangeListener引用到另一个类?,java,swing,class,applet,Java,Swing,Class,Applet,我放弃所有这些代码,使用完全不同的代码>>> 不用再回答了 我从我的教授那里得到了一份家庭作业。他告诉我们使用4个类来制作applet绘画程序。 主要的光源面板;绘图板;调色板面板 (基本代码没有给出;只有类) 该程序将采取鼠标输入和绘制圆时,我做了一个圆线。根据光源的不同,圆圈将产生“发光效果”(使用JSlider作为光源)。滑动JSlider时,圆圈发光效果会实时更改 我在将LightSource事件侦听器引用到绘图时遇到问题,因此它会更改DrawingPanel内的“int light”。
public class HW3_to_4 extends Applet {
public void init (){
Dimension d = this.getSize();
setLayout(new BorderLayout());
JPanel Pale = new PalettePanel();
Pale.setBorder(BorderFactory.createLineBorder(Color.black, 5));
JPanel Light = new LightSourcePanel();
Light.setBorder(BorderFactory.createLineBorder(Color.black, 5));
JPanel Draw = new DrawingPanel();
Cursor c = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
Draw.setCursor(c);
Draw.setBorder(BorderFactory.createLineBorder(Color.green, 3));
add(Pale, BorderLayout.SOUTH );
add(Light,BorderLayout.NORTH);
add(Draw,BorderLayout.CENTER);
}
}
调色板面板代码:
class PalettePanel extends JPanel implements ChangeListener {
JColorChooser j;
public PalettePanel () {
j = new JColorChooser ();
j.setPreviewPanel(new JPanel());
j.getSelectionModel().addChangeListener(this);
this.add(j);
}
public void stateChanged (ChangeEvent e){
Color a = j.getColor();
DrawingPanel.changecolor (a);
}
}
DrawingPanel代码和内部子类(DrawingCanvas和多段线)
我从YAIP的一个示例页面上撕下了这个。
:
公共类DrawingPanel扩展了JPanel{
私有列表行=新的ArrayList();
专用静态多段线;
私有整数maxX,maxY,difX,difY,minX,minY;
专用静态int光源=0;
公共静态最终整幅画布宽度=2000;
公共静态最终内部画布高度=800;
公共静态整数[][]圆圈=新整数[1000][4];
公共静态整数检查=0;
公共静态颜色c=颜色为红色;
公共绘图面板(){
DrawingCanvas canvas=新建DrawingCanvas();
尺寸d=新尺寸(画布宽度、画布高度);
canvas.setPreferredSize(d);
canvas.addMouseListener(新的MouseAdapter(){
公共无效鼠标按下(MouseEvent e){
currentline=新的多段线();
currentline.line_color=c;
行。添加(当前行);
currentline.add(e.getX(),e.getY());
}
});
canvas.addMouseMotionListener(新的MouseMotionAdapter(){
公共无效鼠标标记(鼠标事件e){
currentline.add(e.getX(),e.getY());
重新油漆();
}
});
canvas.addMouseListener(新的MouseAdapter(){
公共无效MouseEvent(MouseEvent e){
对于(int i=0;i首先,更改changecolor(颜色)方法删除静态关键字。然后您需要一个DrawingColor实例来使用该类。我会将其实例存储在一个字段中,就像存储JColorChooser一样。很抱歉,这只会使错误“无法引用非静态”出现在JColorChooser中PalettePanel上的侦听器上。1)为什么要编写小程序?如果是因为老师的规范,请参考他们。2)为什么要使用AWT而不是Swing?请参阅我的答案,了解放弃使用AWT组件的许多好理由。3)要更快获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。
public class DrawingPanel extends JPanel {
private List<PolyLine> lines = new ArrayList<PolyLine>();
private static PolyLine currentline;
private int maxX,maxY,difX, difY,minX,minY;
private static int lightSource = 0;
public static final int CANVAS_WIDTH = 2000;
public static final int CANVAS_HEIGHT = 800;
public static int[][] circle = new int[1000][4];
public static int check = 0;
public static Color c = Color.RED;
public DrawingPanel(){
DrawingCanvas canvas = new DrawingCanvas();
Dimension d = new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT);
canvas.setPreferredSize(d);
canvas.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
currentline = new PolyLine();
currentline.line_color = c;
lines.add(currentline);
currentline.add(e.getX(), e.getY());
}
});
canvas.addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
currentline.add(e.getX(), e.getY());
repaint();
}
});
canvas.addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent e){
for(int i = 0; i<currentline.xList.size()-1; i++){
if(maxX<currentline.xList.get(i)){
maxX = currentline.xList.get(i);
}
}
for(int i = 0; i<currentline.yList.size()-1; i++){
if(maxY<currentline.yList.get(i)){
maxY = currentline.yList.get(i);
}
}
minX = maxX;
for(int i = 0; i<currentline.xList.size()-1; i++){
if(minX>currentline.xList.get(i)){
minX = currentline.xList.get(i);
}
}
minY = maxY;
for(int i = 0; i<currentline.yList.size()-1; i++){
if(minY>currentline.yList.get(i)){
minY = currentline.yList.get(i);
}
}
difX = maxX - minX;
difY = maxY - minY;
currentline.addcircle(minX,minY, difX, difY);
circle[check][0] = minX;
circle[check][1] = minY;
circle[check][2] = difX;
circle[check][3] = difY;
check++;
repaint();
maxX = 0; difX = 0;
maxY = 0; difY = 0;
}
});
this.add(canvas);
}
public static void changecolor(Color b){
c = b;
}
public void lightChange (int light){
lightSource = light;
RE();
}
public void RE (){
for (int x = 0; x< check ; x++) currentline.addcircle(circle[x][0],circle[x][1], circle[x][2],circle[x][3],lightSource);
repaint();
}
private class DrawingCanvas extends JPanel{
public void paint(Graphics g){
for(PolyLine line : lines){
g.setColor(line.line_color);
line.draw(g);
}
}
}
static class PolyLine{
public Color line_color = Color.RED;
private List <Integer> xList;
private List <Integer> yList;
boolean drawcircle = false;
int minx, miny, difx, dify, light;
public PolyLine() {
xList = new ArrayList<Integer>();
yList = new ArrayList<Integer>();
}
public void add(int x, int y){
xList.add(x);
yList.add(y);
}
public void addcircle(int x, int y, int difx, int dify){
this.minx = x; this.miny = y; this.difx = difx; this.dify = dify;
drawcircle = true;
}
public void addcircle(int x, int y, int difx, int dify, int light){
this.minx = x; this.miny = y; this.difx = difx; this.dify = dify; this.light = light;
drawcircle = true;
}
public void draw(Graphics g){
if(drawcircle){
g.fillOval(minx, miny, difx, dify);
g.setColor(Color.WHITE);
g.fillOval((minx+difx/4)+light, miny+dify/4, difx/4, dify/4);
g.setColor(line_color);
}else{
for(int i = 0; i<xList.size()-1; i++){
g.drawLine((int)xList.get(i), (int)yList.get(i), (int)xList.get(i + 1),
(int)yList.get(i + 1));
}
}
}}}
Here is the problem.
LightSourcePanel Code:
class LightSourcePanel extends JPanel implements ChangeListener {
static JSlider j;
public LightSourcePanel (){
j = new JSlider(0,180,90);
j.setMajorTickSpacing(45);
j.setMinorTickSpacing(5);
j.setPaintLabels(true);
j.setPaintTicks (true);
j.setPreferredSize(new Dimension (1500,50));
j.addChangeListener(this);
this.add(j);
}
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
lightChange(j.getValue()); // problem <<<<<< FAIL
}}