Swing组件显示的问题 本帖最后由 turtlefly 于 2012-01-14 22:14:32 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单的调用super.*****()?不可以吧? 以下是MineSweeper类:import java.awt.*;import javax.swing.*;public class MineSweeper { static JFrame f = new JFrame("Mine Sweeper"); static MyDrawPanel mdp; public static void main(String[] args){ MineSweeper ms = new MineSweeper(); ms.go(); } public void setUpGui(){ mdp = new MyDrawPanel(); JButton j = new MineButton(3,4,'a'); mdp.add(j); f.setLayout(new BorderLayout()); f.setContentPane(mdp); f.setBounds(300,300,600,400); f.setResizable(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } public void go(){ setUpGui(); } class MyDrawPanel extends JPanel{ @Override public void repaint() { // TODO Auto-generated method stub super.repaint(); } @Override public void updateUI() { // TODO Auto-generated method stub super.updateUI(); } @Override public void validate() { // TODO Auto-generated method stub super.validate(); } }}以下是MineButton类:import java.awt.*;import java.awt.event.*;import javax.swing.JButton;public class MineButton extends JButton{ //state of this mine button //1:unsigned //2:opened //3:ed //4:questioned private int state=0; private boolean ifAMine; private int x; private int y; //char of mine number around this button //mineNumer=='m' shows a mine here; private char mineNumber; public MineButton(int x, int y, char c) { this.x = x; this.y = y; if((this.mineNumber=c)=='m'){ ifAMine = true; } //this.setBackground(Color.BLUE); //this.addMouseListener(new ClickMouse()); } @Override public void repaint() { // TODO Auto-generated method stub super.repaint(); } @Override public void paintComponents(Graphics g) { // TODO Auto-generated method stub super.paintComponents(g); } @Override public void updateUI() { // TODO Auto-generated method stub super.updateUI(); } } 抱歉我贴上来的一段删去了一些getter setter和实现的MouseListener,删去之后问题可以解决,但是把这些加上,原始的MineButton类是下面这样的,就会出现上述问题,请问知道是为什么吗?import java.awt.*;import java.awt.event.*;import javax.swing.JButton;public class MineButton extends JButton{ //state of this mine button //1:unsigned //2:opened //3:ed //4:questioned private int state=0; private boolean ifAMine; private int x; private int y; //char of mine number around this button //mineNumer=='m' shows a mine here; private char mineNumber; public MineButton(int x, int y, char c) { this.x = x; this.y = y; if((this.mineNumber=c)=='m'){ ifAMine = true; } //this.setBackground(Color.BLUE); //this.addMouseListener(new ClickMouse()); } @Override public void repaint() { // TODO Auto-generated method stub super.repaint(); } @Override public void paintComponents(Graphics g) { // TODO Auto-generated method stub super.paintComponents(g); } @Override public void updateUI() { // TODO Auto-generated method stub super.updateUI(); } void leftClick(){ if (ifAMine==true) { System.out.println("Loser!"); } else{ System.out.println("Number of mine is:"+mineNumber); } } void rightClick(){ state = 3; System.out.println("Grid ("+x+","+y+") have a flag."); } void leftRightClick(){ //实现一下打印周围格子坐标的动作 } class ClickMouse implements MouseListener{ public void mouseEntered(MouseEvent event) { ((MineButton)(event.getSource())).setBackground(Color.CYAN); } public void mousePressed(MouseEvent event){ ((MineButton)(event.getSource())).setBackground(Color.GRAY); } public void mouseClicked(MouseEvent event){// System.out.println("("+((MineButton)(event.getSource())).getX()// +","+((MineButton)(event.getSource())).getY()+")"); System.out.println("("+x+","+y+")"); ((MineButton)(event.getSource())).setText(""+mineNumber); // TODO 将在此处添加您的处理代码: int buttonKey = event.getButton(); if( buttonKey == event.BUTTON1 && event.getClickCount() == 2 ) { System.out.println("双击了鼠标左键:"); } else if( buttonKey == event.BUTTON2 ) { System.out.println("点击了鼠标中键"); } else if( buttonKey == event.BUTTON3 ) { System.out.println("点击了鼠标右键"); } } public void mouseExited(MouseEvent event) { ((MineButton)(event.getSource())).setBackground(Color.BLUE); } public void mouseReleased(MouseEvent event) { //judge(); } } public char getMineNumber(){ return mineNumber; } public int getState() { return state; } public void setState(int state) { this.state = state; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; }} 问题就出在getX 和 getY 这两个方法上这个你看起来似乎只是你内部变量的两个 get 方法其实你无意中覆盖了 component 的原有的 getX 和 getY 方法这两个方法在呈现控件和布局时会被 Swing 内部代码调用到你重写了,导致布局和呈现时无法获得正确的 x,y 坐标才出的问题 怎么样知道自己的内存泄露了?? 没有任何字符怎么表达?谢谢 求助~~~~~~~~~~菜鸟也可以进~~~~ 请教:生产者和消费者问题.大家帮忙一修改一下.. 如何在一个文本框内实现智能感知并跟随光标移动的下拉列表框?100分送上 最简单的问题。你肯定做过的 swt printer连续打印问题 请教Array的问题之二 刚转delphi学jbulder5 两天的问题..大家来拿拿分.. 关于类加载机制中解析和分派的一点问题 路往哪儿走 java函数调用问题
import java.awt.*;
import javax.swing.*;public class MineSweeper {
static JFrame f = new JFrame("Mine Sweeper");
static MyDrawPanel mdp;
public static void main(String[] args){
MineSweeper ms = new MineSweeper();
ms.go();
}
public void setUpGui(){
mdp = new MyDrawPanel();
JButton j = new MineButton(3,4,'a');
mdp.add(j);
f.setLayout(new BorderLayout());
f.setContentPane(mdp);
f.setBounds(300,300,600,400);
f.setResizable(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public void go(){
setUpGui();
}
class MyDrawPanel extends JPanel{
@Override
public void repaint() {
// TODO Auto-generated method stub
super.repaint();
}
@Override
public void updateUI() {
// TODO Auto-generated method stub
super.updateUI();
}
@Override
public void validate() {
// TODO Auto-generated method stub
super.validate();
}
}
}
以下是MineButton类:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JButton;public class MineButton extends JButton{
//state of this mine button
//1:unsigned
//2:opened
//3:ed
//4:questioned
private int state=0;
private boolean ifAMine;
private int x;
private int y;
//char of mine number around this button
//mineNumer=='m' shows a mine here;
private char mineNumber;
public MineButton(int x, int y, char c) {
this.x = x;
this.y = y;
if((this.mineNumber=c)=='m'){
ifAMine = true;
}
//this.setBackground(Color.BLUE);
//this.addMouseListener(new ClickMouse());
}
@Override
public void repaint() {
// TODO Auto-generated method stub
super.repaint();
}
@Override
public void paintComponents(Graphics g) {
// TODO Auto-generated method stub
super.paintComponents(g);
}
@Override
public void updateUI() {
// TODO Auto-generated method stub
super.updateUI();
}
}
抱歉我贴上来的一段删去了一些getter setter和实现的MouseListener,删去之后问题可以解决,但是把这些加上,原始的MineButton类是下面这样的,就会出现上述问题,请问知道是为什么吗?
import java.awt.*;
import java.awt.event.*;
import javax.swing.JButton;public class MineButton extends JButton{
//state of this mine button
//1:unsigned
//2:opened
//3:ed
//4:questioned
private int state=0;
private boolean ifAMine;
private int x;
private int y;
//char of mine number around this button
//mineNumer=='m' shows a mine here;
private char mineNumber;
public MineButton(int x, int y, char c) {
this.x = x;
this.y = y;
if((this.mineNumber=c)=='m'){
ifAMine = true;
}
//this.setBackground(Color.BLUE);
//this.addMouseListener(new ClickMouse());
}
@Override
public void repaint() {
// TODO Auto-generated method stub
super.repaint();
}
@Override
public void paintComponents(Graphics g) {
// TODO Auto-generated method stub
super.paintComponents(g);
}
@Override
public void updateUI() {
// TODO Auto-generated method stub
super.updateUI();
}
void leftClick(){
if (ifAMine==true) {
System.out.println("Loser!");
}
else{
System.out.println("Number of mine is:"+mineNumber);
}
}
void rightClick(){
state = 3;
System.out.println("Grid ("+x+","+y+") have a flag.");
}
void leftRightClick(){
//实现一下打印周围格子坐标的动作
}
class ClickMouse implements MouseListener{
public void mouseEntered(MouseEvent event) {
((MineButton)(event.getSource())).setBackground(Color.CYAN);
}
public void mousePressed(MouseEvent event){
((MineButton)(event.getSource())).setBackground(Color.GRAY);
}
public void mouseClicked(MouseEvent event){
// System.out.println("("+((MineButton)(event.getSource())).getX()
// +","+((MineButton)(event.getSource())).getY()+")");
System.out.println("("+x+","+y+")");
((MineButton)(event.getSource())).setText(""+mineNumber);
// TODO 将在此处添加您的处理代码:
int buttonKey = event.getButton();
if( buttonKey == event.BUTTON1 && event.getClickCount() == 2 ) {
System.out.println("双击了鼠标左键:");
} else if( buttonKey == event.BUTTON2 ) {
System.out.println("点击了鼠标中键");
} else if( buttonKey == event.BUTTON3 ) {
System.out.println("点击了鼠标右键");
}
}
public void mouseExited(MouseEvent event) {
((MineButton)(event.getSource())).setBackground(Color.BLUE);
}
public void mouseReleased(MouseEvent event) {
//judge();
}
}
public char getMineNumber(){
return mineNumber;
} public int getState() {
return state;
} public void setState(int state) {
this.state = state;
} public int getX() {
return x;
} public void setX(int x) {
this.x = x;
} public int getY() {
return y;
} public void setY(int y) {
this.y = y;
}
}
getX 和 getY 这两个方法上
这个你看起来似乎只是你内部变量的两个 get 方法
其实你无意中覆盖了 component 的原有的 getX 和 getY 方法
这两个方法在呈现控件和布局时会被 Swing 内部代码调用到
你重写了,导致布局和呈现时无法获得正确的 x,y 坐标
才出的问题