Java 奇怪的提神行为
我做了一个网格,你可以在那里放置标记。我的问题是,当我调整窗口大小时,这些标记有时会出现,有时不会出现。此外,当我遮住窗口的一部分时,我会丢失该区域的标记 代码非常简单:Java 奇怪的提神行为,java,user-interface,Java,User Interface,我做了一个网格,你可以在那里放置标记。我的问题是,当我调整窗口大小时,这些标记有时会出现,有时不会出现。此外,当我遮住窗口的一部分时,我会丢失该区域的标记 代码非常简单: import javax.swing.*; 导入java.lang.Math; 导入java.awt.*; 导入java.awt.event.*; 枚举标记颜色{ 红色,绿色,没有 }; 公共类tictactoe扩展JFrame{ 私有类Plansza扩展了JPanel{ 私有整数x0,y0,网格大小,步长; 专用图形; 专用
import javax.swing.*;
导入java.lang.Math;
导入java.awt.*;
导入java.awt.event.*;
枚举标记颜色{
红色,绿色,没有
};
公共类tictactoe扩展JFrame{
私有类Plansza扩展了JPanel{
私有整数x0,y0,网格大小,步长;
专用图形;
专用markerColor[][]网格;
公共计划(a){
网格=新的markerColor[29][29];
for(inti=0;i=gridSize)返回;
int X=X/步,Y=Y/步;
placeMarker(X,Y,markerColor.green);
栅格[X][Y]=标记颜色绿色;
}
});
}
公共组件(图形g){
超级组件(g);
int width=getWidth();
int height=getHeight();
gridSize=数学最小值(宽度、高度);
步长=网格大小/29;
gridSize=步骤*29;
x0=(宽度网格尺寸)/2;
y0=(高度网格大小)/2;
graph=getGraphics();
g、 设置颜色(颜色为黑色);
对于(inti=1,pointer=step;i我试图用它制作一个SSCCE,它工作正常
public class SSCCE extends JPanel {
enum markerColor {
red, green, none
};
markerColor grid [][];
int gridSize = 29;
int x0 = 0;
int y0=0;
int step = 1;
Graphics graph;
public SSCCE() {
grid = new markerColor[29][29];
for(int i = 0; i<29;i++)
for(int j = 0; j<29;j++)
grid[i][j] = markerColor.none;
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int x = e.getX(), y = e.getY();
x-=x0; y-=y0;
int X = x/step, Y = y/step;
//Changed here
if(X>=gridSize || Y>=gridSize || X < 0 || Y < 0) return;
placeMarker(X,Y, markerColor.green);
grid[X][Y] = markerColor.green;
//Call repaint in the mouse click
repaint();
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
int width = getWidth();
int height = getHeight();
int gridSize = Math.min(width,height);
step = gridSize/29;
gridSize = step*29;
x0 = (width-gridSize)/2;
y0 = (height-gridSize)/2;
graph = g;
graph.setPaintMode();
g.setColor(Color.black);
for(int i = 1, pointer=step; i<=28; i++, pointer+=step) {
g.drawLine(x0+pointer,y0,x0+pointer,y0+gridSize);
g.drawLine(x0,y0+pointer,x0+gridSize,y0+pointer);
}
g.fillOval(10, 10, 40, 50);
for(int i = 0; i<29;i++)
for(int j = 0; j<29;j++)
if(grid[i][j] != markerColor.none)
placeMarker(i,j,grid[i][j]);
}
public void placeMarker(int X, int Y, markerColor m) {
int x = X*step+2*step/10, y = Y*step+2*step/10;
switch(m) {
case red:
graph.setColor(Color.red);
break;
case green:
graph.setColor(Color.green);
break;
default :
graph.setColor(Color.blue);
}
graph.fillOval(x0+x,y0+y, step*6/10, step*6/10);
}
public static void main(String arg[]){
JFrame frame = new JFrame();
frame.add(new SSCCE(), BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
公共类SSCCE扩展了JPanel{
枚举标记颜色{
红色,绿色,没有
};
markerColor网格[];
int gridSize=29;
int x0=0;
int y0=0;
int步长=1;
图形;
公共服务{
网格=新的markerColor[29][29];
对于(int i=0;i=gridSize | | X<0 | | Y<0)返回;
placeMarker(X,Y,markerColor.green);
栅格[X][Y]=标记颜色绿色;
//在鼠标单击中调用“重新绘制”
重新油漆();
}
});
}
公共组件(图形g){
超级组件(g);
int width=getWidth();
int height=getHeight();
int gridSize=Math.min(宽度、高度);
步长=网格大小/29;
gridSize=步骤*29;
x0=(宽度网格尺寸)/2;
y0=(高度网格大小)/2;
图=g;
setPaintMode();
g、 设置颜色(颜色为黑色);
对于(int i=1,pointer=step;如果要更快地获得帮助,请发布一条。for(int i=0;我刚刚在鼠标单击中尝试了重新绘制(),效果非常糟糕:(。如果只是我,这一定是操作系统相关的问题:C@lord.didger也可以使用paintComponent(graphics g)
的图形对象,而不是getGraphics