Java 向JFrame添加项目会迫使它们落后吗?
大家好,我有这个问题,我似乎无法解决。我得到了一些代码,不得不做一个“井字游戏”。相当原始。目前,它想让我做的是接受用户输入(它只要求您放置标记的行/列),并在板的相应正方形上绘制一个椭圆形。我当前的代码如下所示,工作中指定我创建一个新类来处理用户输入 我目前只是想让它在JFrame中添加新的项目,但收效甚微。我有一个虚拟的输入调用,它不检查我输入的内容,它只调用一个椭圆形,应该位于左上角的第一个正方形中。我可以将对象绘制到JFrame上(尽管它占据了整个框架),但它始终位于实际板的后面(即:如果我拉伸框架,我可以看到圆)。我尝试过添加JPanel等等,这样他们就可以坐在董事会的顶端,但到目前为止,我运气不好 下面是创建椭圆形的代码,我是为这个任务而得到的。我所做的只是实例化一个位置为(0,0,10,10)的新椭圆。然而,当它绘制时,它占据了整个JFrame,但它也在实际板的后面。。。。。。有什么想法吗Java 向JFrame添加项目会迫使它们落后吗?,java,swing,jframe,behind,Java,Swing,Jframe,Behind,大家好,我有这个问题,我似乎无法解决。我得到了一些代码,不得不做一个“井字游戏”。相当原始。目前,它想让我做的是接受用户输入(它只要求您放置标记的行/列),并在板的相应正方形上绘制一个椭圆形。我当前的代码如下所示,工作中指定我创建一个新类来处理用户输入 我目前只是想让它在JFrame中添加新的项目,但收效甚微。我有一个虚拟的输入调用,它不检查我输入的内容,它只调用一个椭圆形,应该位于左上角的第一个正方形中。我可以将对象绘制到JFrame上(尽管它占据了整个框架),但它始终位于实际板的后面(即:如
package lab4;
import javax.swing.*;
import java.awt.*;
/** Oval Supplier Class
* Author: David D. Riley
* Date: April, 2004
*/
public class Oval extends JComponent {
/** post: getX() == x and getY() == y
* and getWidth() == w and getHeight() == h
* and getBackground() == Color.black
*/
public Oval(int x, int y, int w, int h) {
super();
setBounds(x, y, w, h);
setBackground(Color.black);
}
/** post: this method draws a filled Oval
* and the upper left corner of the bounding rectangle is (getX(), getY())
* and the oval's dimensions are getWidth() and getHeight()
* and the oval's color is getBackground()
*/
public void paint(Graphics g) {
g.setColor( getBackground() );
g.fillOval(0, 0, getWidth()-1, getHeight()-1);
paintChildren(g);
}
}
编辑:这是我们现在正在查看的代码--
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package lab4;
/**
*
* @author Scott
*/
import java.awt.*;
import java.util.Scanner;
import javax.swing.*;
public class GameBoard {
private JFrame win;
private int count = 1;
//Create new GUI layout
GridLayout layout = new GridLayout(3, 3);
JPanel panel = new JPanel(layout);
//Create a new Array of Rectangles
Rectangle[][] rect = new Rectangle[3][3];
public GameBoard() {
//Create new JFrame + Set Up Default Behaviour
win = new JFrame("Tic Tac Toe");
win.setBounds(0, 0, 195, 215);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setResizable(true);
//Loop goes through each line of the array. It creates a new rectangle
//determines it's colour based on modulus division
//Add's the rectangle to the JPanel.
for (int i = 0; i < rect.length; i++) {
for (int j = 0; j < rect[i].length; j++) {
rect[i][j] = new Rectangle(0, 0, 1, 1);
if (count % 2 != 0) {
rect[i][j].setBackground(Color.black);
} else {
rect[i][j].setBackground(Color.red);
}
panel.add(rect[i][j]);
count++;
}
}
//Sets the game to be visible.
win.add(panel);
win.setVisible(true);
//userInput();
}
private void userInput() {
Scanner scan = new Scanner(System.in);
}
}
/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
包装lab4;
/**
*
*@作者斯科特
*/
导入java.awt.*;
导入java.util.Scanner;
导入javax.swing.*;
公共类游戏板{
私营部门赢得;
私有整数计数=1;
//创建新的GUI布局
GridLayout=新的GridLayout(3,3);
JPanel面板=新JPanel(布局);
//创建一个新的矩形数组
矩形[][]矩形=新矩形[3][3];
公共游戏局(){
//创建新JFrame+设置默认行为
win=新JFrame(“Tic Tac Toe”);
赢。挫折(0,0,195,215);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setresizeable(true);
//循环遍历数组的每一行。它创建一个新的矩形
//根据模数划分确定其颜色
//将矩形添加到JPanel。
for(int i=0;i
让我们从椭圆形课堂开始
这是一个非常糟糕的主意
public void paint(Graphics g) {
// No super.paint(g) call, hello to a world of pain...
// Paint some stuff
g.setColor( getBackground() );
g.fillOval(0, 0, getWidth()-1, getHeight()-1);
// Then draw the children over it...???
paintChildren(g);
}
这是一个更好的方法
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor( getBackground() ); // Might want to pick a better color...
g.fillOval(0, 0, getWidth()-1, getHeight()-1);
}
猜测一下,我建议您的窗口使用的布局管理器覆盖了
设置框
调用让我们从您的椭圆类开始
这是一个非常糟糕的主意
public void paint(Graphics g) {
// No super.paint(g) call, hello to a world of pain...
// Paint some stuff
g.setColor( getBackground() );
g.fillOval(0, 0, getWidth()-1, getHeight()-1);
// Then draw the children over it...???
paintChildren(g);
}
这是一个更好的方法
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor( getBackground() ); // Might want to pick a better color...
g.fillOval(0, 0, getWidth()-1, getHeight()-1);
}
猜测一下,我建议您的窗口使用的布局管理器覆盖了
设置框
调用答案是我需要坚持流程布局,手动调整矩形大小,并使用JLayeredPane。我不知道这是存在的,与我的讲师交谈,他说我的思维过程是正确的,这是他希望我这样做的方式……这是多么痛苦,但都是因为那些帮助。答案是我需要坚持流程布局,手动调整矩形的大小,并使用JLayeredPane代替。我不知道这是存在的,跟我的讲师谈了谈,他说我的思维过程是正确的,这就是他希望我这样做的方式……多痛苦啊,但都是因为那些帮助了我的人。你为什么要使用绘画??除了您没有调用super.paint之外,您应该使用paintComponent
好的,我快速查看了您的代码,您的GameBoard
方法绝对无法工作JFrame
不接受通过我知道的任何add
方法的Rectangle
,它通常需要组件。如果没有合适的工具,将很难帮助您如何将椭圆形组件添加到JFrame?如果您只需调用add(new Oval())并保留JFrame内容窗格的默认LayoutManager,那么您将使用BorderLayout,它将覆盖对setBounds的调用,并使椭圆形占据整个区域。是的,这就是它所做的,除了我还落后于在框架上绘制的任何其他内容之外。我可以通过在混合中添加一个JPanel或类似的东西来解决这个问题吗?永远不要在Swing中进行任何手动大小调整/定位,这是合适的布局管理器的专属任务。为什么要使用绘制??除了您没有调用super.paint之外,您应该使用paintComponent
好的,我快速查看了您的代码,您的GameBoard
方法绝对无法工作JFrame
不接受通过我知道的任何add
方法的Rectangle
,它通常需要组件。如果没有合适的工具,将很难帮助您如何将椭圆形组件添加到JFrame?如果您只需调用add(new Oval()),并且保留了JFrame内容窗格的默认布局管理器,那么您将使用BorderLayout,它将覆盖对setBounds的调用,并使椭圆占据整个区域。是的,这就是它所做的,除了我还落下了b