尽管边界在大小内,但JButton仍部分地在窗口外部绘制

时间:2019-04-12 14:17:29

标签: java

我是一名学生,试图弄清楚Java图形的基础知识。我的课创建了一个窗口,每次按下该按钮时,都会移动一个红色按钮。我将窗口的边界设置为720x720,按钮的宽度为50像素。每次按下该按钮时,按钮都会转到介于0和670之间的新的x和y坐标。我的理解是,如果使用参数(670,670,50,50)调用setBounds()方法,则红色按钮将被占用窗口的右下角。

不幸的是,即使将边界设置为(660,660,50,50)之类的按钮,按钮似乎仍在窗口之外。

Problem

我尝试通过打印坐标的每一次更改来跟踪边界,但这仍然没有加起来。

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);
   } 
}

1 个答案:

答案 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()的部分