Java 重新定位JFrame的ContentPane
我试图在JFrame的内容窗格中绘制一个网格,但当我这样做时,一切都关闭了。网格开始时太宽和偏移(可能是在窗口边框与contentpane重叠的位置设置的),无法正确绘制整个网格。当我使用Java 重新定位JFrame的ContentPane,java,swing,jframe,Java,Swing,Jframe,我试图在JFrame的内容窗格中绘制一个网格,但当我这样做时,一切都关闭了。网格开始时太宽和偏移(可能是在窗口边框与contentpane重叠的位置设置的),无法正确绘制整个网格。当我使用frame.setUndercorated(true)时一切都很完美 import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import jav
frame.setUndercorated(true)时代码>一切都很完美
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.*;
@SuppressWarnings("serial")
class Creator extends JFrame{
JFrame frame;
int[][] Grid = new int[18][27];
public Creator(){
frame = this;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for(int i = 0; i < 18; i++) {
for(int j = 0; j < 27; j++) {
Grid[i][j] = 0;
}
}
setSize(864, 544);
getContentPane().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int yLocation = e.getX()/32;
int xLocation = e.getY()/32;
System.out.println(xLocation + " " + yLocation);
if(e.getButton() == 1){
if(xLocation < 1 || yLocation < 1){
Grid[xLocation][yLocation] = 2;
System.out.println("Enemy Added");
}else if(xLocation > 16 || yLocation > 25){
Grid[xLocation][yLocation] = 2;
System.out.println("Enemy Added");
}else {
Grid[xLocation][yLocation] = 1;
System.out.println("Obstacle Added");
}
}else {
Grid[xLocation][yLocation] = 0;
System.out.println("Item Removed");
}
frame.invalidate();
frame.validate();
frame.repaint();
}
});
}
public void paint(Graphics g) {
g.clearRect(0, 0, 864, 544);
Graphics2D g2 = (Graphics2D) g;
for(int i =0; i < 18; i++) {
for(int j =0; j < 27; j++) {
if(Grid[i][j] != 0){
if( i < 1 || j < 1 || i > 26 || j > 17) {
g2.setColor(Color.RED);
g2.fillRect(j*32, i*32, 32, 32);
}else {
g2.setColor(Color.BLUE);
g2.fillRect(j*32, i*32, 32, 32);
}
}
//System.out.print(Grid[i][j]);
}
//System.out.println();
}
for(int i = 0; i < 27; i++) {
Line2D lin = new Line2D.Float(i*32, 0, i*32, 544);
g2.draw(lin);
}
for(int i = 0; i < 18; i++) {
Line2D lin = new Line2D.Float(0, i*32, 864, i*32);
g2.draw(lin);
}
}
public static void main(String []args){
Creator s=new Creator();
s.setVisible(true);
}
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.geom.*;
@抑制警告(“串行”)
类创建者扩展了JFrame{
JFrame框架;
int[][]网格=新int[18][27];
公共创建者(){
帧=此;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
对于(int i=0;i<18;i++){
对于(int j=0;j<27;j++){
网格[i][j]=0;
}
}
设置大小(864544);
getContentPane().addMouseListener(新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
int-yLocation=e.getX()/32;
int xLocation=e.getY()/32;
System.out.println(xLocation+“”+yLocation);
如果(如getButton()==1){
如果(X位置<1 | Y位置<1){
网格[xLocation][y位置]=2;
System.out.println(“敌人添加”);
}否则如果(位置>16 |位置>25){
网格[xLocation][y位置]=2;
System.out.println(“敌人添加”);
}否则{
网格[xLocation][y位置]=1;
System.out.println(“添加障碍物”);
}
}否则{
网格[xLocation][yLocation]=0;
系统输出打印项次(“删除项”);
}
frame.invalidate();
frame.validate();
frame.repaint();
}
});
}
公共空间涂料(图g){
g、 clearRect(0,0864544);
图形2d g2=(图形2d)g;
对于(int i=0;i<18;i++){
对于(int j=0;j<27;j++){
如果(网格[i][j]!=0){
如果(i<1 | | j<1 | | i>26 | | j>17){
g2.设置颜色(颜色为红色);
g2.fillRect(j*32,i*32,32,32);
}否则{
g2.setColor(颜色为蓝色);
g2.fillRect(j*32,i*32,32,32);
}
}
//系统输出打印(网格[i][j]);
}
//System.out.println();
}
对于(int i=0;i<27;i++){
Line2D lin=新的Line2D.Float(i*32,0,i*32544);
g2.画(林);
}
对于(int i=0;i<18;i++){
Line2D lin=新的Line2D.Float(0,i*32864,i*32);
g2.画(林);
}
}
公共静态void main(字符串[]args){
Creator s=新的Creator();
s、 setVisible(真);
}
}
不要设置框架的大小
相反,创建JPanel或JComponent的子类,重写paintComponent()
以绘制网格,重写getPreferredSize()
以返回其应有的大小(864 x 544)。将此面板添加到您的框架中,并调用pack()
,以确保框架大小能够自行调整,以使其组件显示为首选大小
编辑:示例:
public class GridPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
// paint the grid here
}
@Override
public Dimension getPreferredSize() {
return new Dimension(864, 544);
}
}
在JFrame构造函数中:
GridPanel gridPanel = new GridPanel();
this.add(gridPanel);
this.pack();
JB Nizet为您提供了极好的解决方案。按如下方式更改代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.*;
@SuppressWarnings("serial")
class Creator extends JPanel{
static int[][] Grid = new int[18][27];
public Creator(){
setSize(getPreferredSize());
}
public void paint(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
Graphics2D g2 = (Graphics2D) g;
for(int i =0; i < 18; i++) {
for(int j =0; j < 27; j++) {
if(Grid[i][j] != 0){
if( i < 1 || j < 1 || i > 26 || j > 17) {
g2.setColor(Color.RED);
g2.fillRect(j*32, i*32, 32, 32);
}else {
g2.setColor(Color.BLUE);
g2.fillRect(j*32, i*32, 32, 32);
}
}
//System.out.print(Grid[i][j]);
}
//System.out.println();
}
for(int i = 0; i < 27; i++) {
Line2D lin = new Line2D.Float(i*32, 0, i*32, getHeight());
g2.draw(lin);
}
for(int i = 0; i < 18; i++) {
Line2D lin = new Line2D.Float(0, i*32, getWidth(), i*32);
g2.draw(lin);
}
}
public static void main(String []args){
JFrame frame=new JFrame();
Creator s=new Creator();
frame.setSize(864, 544);
frame.add(s);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int yLocation = e.getX()/32;
int xLocation = e.getY()/32;
System.out.println(xLocation + " " + yLocation);
if(e.getButton() == 1){
if(xLocation < 1 || yLocation < 1){
Grid[xLocation][yLocation] = 2;
System.out.println("Enemy Added");
}else if(xLocation > 16 || yLocation > 25){
Grid[xLocation][yLocation] = 2;
System.out.println("Enemy Added");
}else {
Grid[xLocation][yLocation] = 1;
System.out.println("Obstacle Added");
}
}else {
Grid[xLocation][yLocation] = 0;
System.out.println("Item Removed");
}
// frame.invalidate();
// frame.validate();
// frame.repaint();
}
});
// s.setUndecorated(true);
}
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.geom.*;
@抑制警告(“串行”)
类创建者扩展了JPanel{
静态int[]Grid=newint[18][27];
公共创建者(){
设置大小(getPreferredSize());
}
公共空间涂料(图g){
g、 clearRect(0,0,getWidth(),getHeight());
图形2d g2=(图形2d)g;
对于(int i=0;i<18;i++){
对于(int j=0;j<27;j++){
如果(网格[i][j]!=0){
如果(i<1 | | j<1 | | i>26 | | j>17){
g2.设置颜色(颜色为红色);
g2.fillRect(j*32,i*32,32,32);
}否则{
g2.setColor(颜色为蓝色);
g2.fillRect(j*32,i*32,32,32);
}
}
//系统输出打印(网格[i][j]);
}
//System.out.println();
}
对于(int i=0;i<27;i++){
line2dlin=newline2d.Float(i*32,0,i*32,getHeight());
g2.画(林);
}
对于(int i=0;i<18;i++){
Line2D lin=new Line2D.Float(0,i*32,getWidth(),i*32);
g2.画(林);
}
}
公共静态void main(字符串[]args){
JFrame=新JFrame();
Creator s=新的Creator();
帧设置大小(864544);
框架。添加(s);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().addMouseListener(新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
int-yLocation=e.getX()/32;
int xLocation=e.getY()/32;
System.out.println(xLocation+“”+yLocation);
如果(如getButton()==1){
如果(X位置<1 | Y位置<1){
网格[xLocation][y位置]=2;
System.out.println(“敌人添加”);
}否则如果(位置>16 |位置>25){
网格[xLocation][y位置]=2;
System.out.println(“敌人添加”);
}否则{