我是一名学生,试图弄清楚Java图形的基础知识。我的课创建了一个窗口,每次按下该按钮时,都会移动一个红色按钮。我将窗口的边界设置为720x720,按钮的宽度为50像素。每次按下该按钮时,按钮都会转到介于0和670之间的新的x和y坐标。我的理解是,如果使用参数(670,670,50,50)调用setBounds()方法,则红色按钮将被占用窗口的右下角。
不幸的是,即使将边界设置为(660,660,50,50)之类的按钮,按钮似乎仍在窗口之外。
我尝试通过打印坐标的每一次更改来跟踪边界,但这仍然没有加起来。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Custom extends JPanel
{
//fields
private int kovakx = 0, kovaky = 0; //stores x and y coordinates of the button
private double accuracy_percent = 100; //not used yet
private JButton kovak = new JButton();
//Only ActionListener this program needs since theres only one button that moves around the screen.
private class Elim implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
kovakx = (int)(Math.random()*670);
kovaky = (int)(Math.random()*670);
kovak.setBounds(kovakx,kovaky,50,50);
System.out.println(kovakx+","+kovaky);//prints out the new coordinates of the button
}
}
//Constructor sets icon and initally puts the button in the top left corner
public Custom()
{
kovak.setIcon(new ImageIcon("Target.png"));
setLayout(null);
kovak.setBounds(0,0,50,50);
kovak.addActionListener(new Elim());
add(kovak);
}
//Creates frame based on teacher's tutorials.
public static void main(String args[])
{
Custom a = new Custom();
JFrame f = new JFrame("Reaction and Accuracy Test");
f.setSize(720,720);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(a);
f.setVisible(true);
}
}
答案 0 :(得分:0)
您设置了框架尺寸,但从未在“自定义”上设置尺寸。如果在Custom上调用getSize(),它将返回(0,0)。因此,我认为发生的事情是框架的大小实际上是(720,720),但这包括装饰区域(例如标题栏)和框架边框。框内的有效区域较小,这就是为什么看不到整个按钮的原因。
解决方案是确定框架内部的实际面积,或者调整框架以使内部区域为(720,720)。
要调整框架以使其内部尺寸为(720,720),通常的方法是设置组件尺寸,然后包装框架:
主要是
f.add(a);
a.setPreferredSize(720,720); // set desired size of JPanel
f.pack(); // resize frame to fit around its contents
f.setVisible(true);
如果要调用pack(),则不必调用frame.setSize(),因为pack会自动设置大小。请注意,您在不调用setPreferredSize()的情况下调用pack时,该帧将是一个很小的零尺寸帧,可能很难看到。如果您运行该程序,但看不到任何可能的问题。
在没有装饰的情况下获得框架尺寸要稍微复杂一些。请参阅JFrame: get size without borders?
中有关getInsets()的部分