我的程序是这样的SketchPanel.java public class SketchPanel extends JPanel implements WindowConstants{ Point2D last; ArrayList lines; Point2D end ; public SketchPanel() { //设置开始点的坐标 last = new Point2D.Double(100,100); lines = new ArrayList(); KeyHandler listener = new KeyHandler(); addKeyListener(listener); //添加按键监听 setFocusable(true); //获取焦点 } //添加坐标 public void add(int x, int y) { //定义空间位置,设置终点坐标 end = new Point2D.Double(last.getX() + x, last.getY() + y); //空间内的线段连接 Line2D line = new Line2D.Double(last,end); lines.add(line); repaint(); //重写 last = end; } // 清空 public void clear() { SketchFrame sp = new SketchFrame(); sp.dispose(); sp.show(); } //画图方法 public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; for (int i=0; i<lines.size(); i++) g2.draw((Line2D)lines.get(i)); } //清空画板 public void clearComponent() { super.paintComponent(this.getGraphics()); } private static final int INCRENMENT = 10;
private class KeyHandler implements KeyListener { //单击键事件 public void keyTyped(KeyEvent event) { char keychar = event.getKeyChar(); int d; // if (Character.isUpperCase(keychar)) { d = INCRENMENT; keychar = Character.toLowerCase(keychar); //转换成小写 } else { d = INCRENMENT; } if (keychar == 'h') add(-d,0); //对h键添加事件 else if (keychar == 'l') add(d,0); else if (keychar == 'k') add(0,-d); else if (keychar == 'j') add(-d,0); else if (keychar == 'a') clear(); } //按键事件 public void keyPressed(KeyEvent event) { //得到键值 int keycode = event.getKeyCode(); int d; d = INCRENMENT; if (keycode == event.VK_LEFT) add(-d,0); //对小键盘左方向键增加具体事件响应 else if (keycode == event.VK_RIGHT) add(d,0); else if (keycode == event.VK_UP) add(0,-d); else if (keycode == event.VK_DOWN) add(0,d); else if (keycode == event.VK_B) clear(); } //弹开事件 public void keyReleased(KeyEvent event) {}
} } SketchFrame.java public class SketchFrame extends JFrame { public SketchFrame() { setTitle("键盘事件"); setSize(300,200); SketchPanel panel = new SketchPanel(); Container c = getContentPane(); c.add(panel); } } Sketch.java public class Sketch { public static void main(String[] args) { SketchFrame sf = new SketchFrame(); //sf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); sf.show(); } } 我想通过SketchPanel里的clear方法关闭上一个窗口,另外再重启一个新窗口
你可以在构造SketchPanel的时候把frame传给他,然后调用其dispose方法。
由于我打开的2个窗口是同一个对象,各位帮我看看sketchPanel 里该怎么改?
import javax.swing.*;import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.geom.*; import java.util.ArrayList;public class SketchPanel extends JPanel implements WindowConstants{ Point2D last; ArrayList lines; Point2D end ; JFrame parent; public SketchPanel(JFrame parent) { this.parent=parent; //设置开始点的坐标 last = new Point2D.Double(100,100); lines = new ArrayList(); KeyHandler listener = new KeyHandler(); addKeyListener((KeyListener) listener); //添加按键监听 setFocusable(true); //获取焦点 } //添加坐标 public void add(int x, int y) { //定义空间位置,设置终点坐标 end = new Point2D.Double(last.getX() + x, last.getY() + y); //空间内的线段连接 Line2D line = new Line2D.Double(last,end); lines.add(line); repaint(); //重写 last = end; } // 清空 public void clear() { System.out.println("hello"); SketchFrame sp = new SketchFrame(); parent.dispose(); sp.setVisible(true); } //画图方法 public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; for (int i=0; i<lines.size(); i++) g2.draw((Line2D)lines.get(i)); } //清空画板 public void clearComponent() { super.paintComponent(this.getGraphics()); } private static final int INCRENMENT = 10;
private class KeyHandler implements KeyListener { //单击键事件 public void keyTyped(KeyEvent event) { char keychar = event.getKeyChar(); int d; // if (Character.isUpperCase(keychar)) { d = INCRENMENT; keychar = Character.toLowerCase(keychar); //转换成小写 } else { d = INCRENMENT; } if (keychar == 'h') add(-d,0); //对h键添加事件 else if (keychar == 'l') add(d,0); else if (keychar == 'k') add(0,-d); else if (keychar == 'j') add(-d,0); else if (keychar == 'a') clear(); } //按键事件 public void keyPressed(KeyEvent event) { //得到键值 int keycode = event.getKeyCode(); int d; d = INCRENMENT; if (keycode == event.VK_LEFT) add(-d,0); //对小键盘左方向键增加具体事件响应 else if (keycode == event.VK_RIGHT) add(d,0); else if (keycode == event.VK_UP) add(0,-d); else if (keycode == event.VK_DOWN) add(0,d); else if (keycode == event.VK_B) clear(); } //弹开事件 public void keyReleased(KeyEvent event) {}
} } SketchFrame.java public class SketchFrame extends JFrame { public SketchFrame() { setTitle("键盘事件"); setSize(300,200); SketchPanel panel = new SketchPanel(this); Container c = getContentPane(); c.add(panel); } }
import javax.swing.*;import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.geom.*; import java.util.ArrayList;public class SketchPanel extends JPanel implements WindowConstants{ Point2D last; ArrayList lines; Point2D end ; JFrame parent; public SketchPanel(JFrame parent) { this.parent=parent; //设置开始点的坐标 last = new Point2D.Double(100,100); lines = new ArrayList(); KeyHandler listener = new KeyHandler(); addKeyListener((KeyListener) listener); //添加按键监听 setFocusable(true); //获取焦点 } //添加坐标 public void add(int x, int y) { //定义空间位置,设置终点坐标 end = new Point2D.Double(last.getX() + x, last.getY() + y); //空间内的线段连接 Line2D line = new Line2D.Double(last,end); lines.add(line); repaint(); //重写 last = end; } // 清空 public void clear() { System.out.println("hello"); SketchFrame sp = new SketchFrame(); parent.dispose(); sp.setVisible(true); } //画图方法 public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; for (int i=0; i<lines.size(); i++) g2.draw((Line2D)lines.get(i)); } //清空画板 public void clearComponent() { super.paintComponent(this.getGraphics()); } private static final int INCRENMENT = 10;
private class KeyHandler implements KeyListener { //单击键事件 public void keyTyped(KeyEvent event) { char keychar = event.getKeyChar(); int d; // if (Character.isUpperCase(keychar)) { d = INCRENMENT; keychar = Character.toLowerCase(keychar); //转换成小写 } else { d = INCRENMENT; } if (keychar == 'h') add(-d,0); //对h键添加事件 else if (keychar == 'l') add(d,0); else if (keychar == 'k') add(0,-d); else if (keychar == 'j') add(-d,0); else if (keychar == 'a') clear(); } //按键事件 public void keyPressed(KeyEvent event) { //得到键值 int keycode = event.getKeyCode(); int d; d = INCRENMENT; if (keycode == event.VK_LEFT) add(-d,0); //对小键盘左方向键增加具体事件响应 else if (keycode == event.VK_RIGHT) add(d,0); else if (keycode == event.VK_UP) add(0,-d); else if (keycode == event.VK_DOWN) add(0,d); else if (keycode == event.VK_B) clear(); } //弹开事件 public void keyReleased(KeyEvent event) {}
} }
SketchFrame.java public class SketchFrame extends JFrame { public SketchFrame() { setTitle("键盘事件"); setSize(300,200); SketchPanel panel = new SketchPanel(this); Container c = getContentPane(); c.add(panel); } }
public class SketchPanel extends JPanel implements WindowConstants{
Point2D last;
ArrayList lines;
Point2D end ;
public SketchPanel() {
//设置开始点的坐标
last = new Point2D.Double(100,100);
lines = new ArrayList();
KeyHandler listener = new KeyHandler();
addKeyListener(listener); //添加按键监听
setFocusable(true); //获取焦点
}
//添加坐标
public void add(int x, int y) {
//定义空间位置,设置终点坐标
end = new Point2D.Double(last.getX() + x, last.getY() + y);
//空间内的线段连接
Line2D line = new Line2D.Double(last,end);
lines.add(line);
repaint(); //重写
last = end;
}
// 清空
public void clear() {
SketchFrame sp = new SketchFrame();
sp.dispose();
sp.show();
}
//画图方法
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
for (int i=0; i<lines.size(); i++)
g2.draw((Line2D)lines.get(i));
}
//清空画板
public void clearComponent() {
super.paintComponent(this.getGraphics());
}
private static final int INCRENMENT = 10;
private class KeyHandler implements KeyListener {
//单击键事件
public void keyTyped(KeyEvent event) {
char keychar = event.getKeyChar();
int d;
//
if (Character.isUpperCase(keychar)) {
d = INCRENMENT;
keychar = Character.toLowerCase(keychar); //转换成小写
} else {
d = INCRENMENT;
}
if (keychar == 'h') add(-d,0); //对h键添加事件
else if (keychar == 'l') add(d,0);
else if (keychar == 'k') add(0,-d);
else if (keychar == 'j') add(-d,0);
else if (keychar == 'a') clear();
}
//按键事件
public void keyPressed(KeyEvent event) {
//得到键值
int keycode = event.getKeyCode();
int d;
d = INCRENMENT;
if (keycode == event.VK_LEFT)
add(-d,0); //对小键盘左方向键增加具体事件响应
else if (keycode == event.VK_RIGHT)
add(d,0);
else if (keycode == event.VK_UP)
add(0,-d);
else if (keycode == event.VK_DOWN)
add(0,d);
else if (keycode == event.VK_B)
clear();
}
//弹开事件
public void keyReleased(KeyEvent event) {}
}
}
SketchFrame.java
public class SketchFrame extends JFrame {
public SketchFrame() {
setTitle("键盘事件");
setSize(300,200);
SketchPanel panel = new SketchPanel();
Container c = getContentPane();
c.add(panel);
}
}
Sketch.java
public class Sketch { public static void main(String[] args) {
SketchFrame sf = new SketchFrame();
//sf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sf.show();
}
}
我想通过SketchPanel里的clear方法关闭上一个窗口,另外再重启一个新窗口
里该怎么改?
import javax.swing.*;import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.*;
import java.util.ArrayList;public class SketchPanel extends JPanel implements WindowConstants{
Point2D last;
ArrayList lines;
Point2D end ;
JFrame parent;
public SketchPanel(JFrame parent) {
this.parent=parent;
//设置开始点的坐标
last = new Point2D.Double(100,100);
lines = new ArrayList();
KeyHandler listener = new KeyHandler();
addKeyListener((KeyListener) listener); //添加按键监听
setFocusable(true); //获取焦点
}
//添加坐标
public void add(int x, int y) {
//定义空间位置,设置终点坐标
end = new Point2D.Double(last.getX() + x, last.getY() + y);
//空间内的线段连接
Line2D line = new Line2D.Double(last,end);
lines.add(line);
repaint(); //重写
last = end;
}
// 清空
public void clear() {
System.out.println("hello");
SketchFrame sp = new SketchFrame();
parent.dispose();
sp.setVisible(true);
}
//画图方法
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
for (int i=0; i<lines.size(); i++)
g2.draw((Line2D)lines.get(i));
}
//清空画板
public void clearComponent() {
super.paintComponent(this.getGraphics());
}
private static final int INCRENMENT = 10;
private class KeyHandler implements KeyListener {
//单击键事件
public void keyTyped(KeyEvent event) {
char keychar = event.getKeyChar();
int d;
//
if (Character.isUpperCase(keychar)) {
d = INCRENMENT;
keychar = Character.toLowerCase(keychar); //转换成小写
} else {
d = INCRENMENT;
}
if (keychar == 'h') add(-d,0); //对h键添加事件
else if (keychar == 'l') add(d,0);
else if (keychar == 'k') add(0,-d);
else if (keychar == 'j') add(-d,0);
else if (keychar == 'a') clear();
}
//按键事件
public void keyPressed(KeyEvent event) {
//得到键值
int keycode = event.getKeyCode();
int d;
d = INCRENMENT;
if (keycode == event.VK_LEFT)
add(-d,0); //对小键盘左方向键增加具体事件响应
else if (keycode == event.VK_RIGHT)
add(d,0);
else if (keycode == event.VK_UP)
add(0,-d);
else if (keycode == event.VK_DOWN)
add(0,d);
else if (keycode == event.VK_B)
clear();
}
//弹开事件
public void keyReleased(KeyEvent event) {}
}
}
SketchFrame.java
public class SketchFrame extends JFrame {
public SketchFrame() {
setTitle("键盘事件");
setSize(300,200);
SketchPanel panel = new SketchPanel(this);
Container c = getContentPane();
c.add(panel);
}
}
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.*;
import java.util.ArrayList;public class SketchPanel extends JPanel implements WindowConstants{
Point2D last;
ArrayList lines;
Point2D end ;
JFrame parent;
public SketchPanel(JFrame parent) {
this.parent=parent;
//设置开始点的坐标
last = new Point2D.Double(100,100);
lines = new ArrayList();
KeyHandler listener = new KeyHandler();
addKeyListener((KeyListener) listener); //添加按键监听
setFocusable(true); //获取焦点
}
//添加坐标
public void add(int x, int y) {
//定义空间位置,设置终点坐标
end = new Point2D.Double(last.getX() + x, last.getY() + y);
//空间内的线段连接
Line2D line = new Line2D.Double(last,end);
lines.add(line);
repaint(); //重写
last = end;
}
// 清空
public void clear() {
System.out.println("hello");
SketchFrame sp = new SketchFrame();
parent.dispose();
sp.setVisible(true);
}
//画图方法
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
for (int i=0; i<lines.size(); i++)
g2.draw((Line2D)lines.get(i));
}
//清空画板
public void clearComponent() {
super.paintComponent(this.getGraphics());
}
private static final int INCRENMENT = 10;
private class KeyHandler implements KeyListener {
//单击键事件
public void keyTyped(KeyEvent event) {
char keychar = event.getKeyChar();
int d;
//
if (Character.isUpperCase(keychar)) {
d = INCRENMENT;
keychar = Character.toLowerCase(keychar); //转换成小写
} else {
d = INCRENMENT;
}
if (keychar == 'h') add(-d,0); //对h键添加事件
else if (keychar == 'l') add(d,0);
else if (keychar == 'k') add(0,-d);
else if (keychar == 'j') add(-d,0);
else if (keychar == 'a') clear();
}
//按键事件
public void keyPressed(KeyEvent event) {
//得到键值
int keycode = event.getKeyCode();
int d;
d = INCRENMENT;
if (keycode == event.VK_LEFT)
add(-d,0); //对小键盘左方向键增加具体事件响应
else if (keycode == event.VK_RIGHT)
add(d,0);
else if (keycode == event.VK_UP)
add(0,-d);
else if (keycode == event.VK_DOWN)
add(0,d);
else if (keycode == event.VK_B)
clear();
}
//弹开事件
public void keyReleased(KeyEvent event) {}
}
}
public class SketchFrame extends JFrame {
public SketchFrame() {
setTitle("键盘事件");
setSize(300,200);
SketchPanel panel = new SketchPanel(this);
Container c = getContentPane();
c.add(panel);
}
}
我的java基础比较差,最近在补基础