在JAVA,JButton中,Button仅在光标位于按钮上时显示,甚至可以在contentPane中的任何位置单击

时间:2012-12-24 11:18:55

标签: java swing click jframe jbutton

我是Java和OOPS的初学者。我正在Head First Java中开始学习,并在其中学习GUI和Swing概念。 以下代码仅用于理解目的。

在运行代码时,框架窗口显示为Button,当我展开它时,我也可以看到单选按钮。

问题 -

  1. 按钮一直工作,直到窗口大小不超过按钮大小。一旦我增加窗口大小甚至比按钮的尺寸略大,那么只有当光标在它上面时才会显示该按钮。
  2. 我正在使用鼠标更改窗口大小。

    1. 即使我将帧大小设置为多于按钮。比如frame.setSize(800,800);然后按钮覆盖整个contentPane。并且在调整大小时仍然表现相同。

    2. 按钮响应单击鼠标,无论我在contentPane中单击何处。只有当我直接点击按钮时它才会响应。

    3. 请告诉我为什么这样做。

      如果可能,请更正代码或添加内容以纠正此问题。

      import java.awt.Color;
      import javax.swing.*;
      import java.awt.event.*;
      public class Test1 implements ActionListener {
      
      JFrame frame = new JFrame("Frame");
      JButton button = new JButton("Button!");
      JRadioButton radio = new JRadioButton("VideoKilledTheRadioStar!",true);
      int j=0;
      
      
      public static void main(String[] args) {
          Test1 t = new Test1();
          t.method1();
      
      }
      public void method1()
      {
      
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      button.setSize(100,100);
      button.setBackground(Color.ORANGE);
      frame.add(button);
      frame.setSize(100,100);
      frame.setVisible(true);
      button.addActionListener(this);
      frame.getContentPane().add(radio);
      radio.addActionListener(this);
      
      }
      public void actionPerformed(ActionEvent e)
      {j++;
      button.setText("clicked .. " + j);
      
          if(button.getBackground()==Color.ORANGE)
          button.setBackground(Color.BLUE);
          else
              button.setBackground(Color.ORANGE);
      }
      
      }
      

      P.S我不知道哪个代码段对这个问题很重要或更相关,所以我已经提供了完整的代码。

2 个答案:

答案 0 :(得分:3)

您在JButton位置添加了button JRadioButtonBorderLayout.CENTER,因此只显示了一个。此位置的组件将在X和Y轴上调整大小。

JButton仅在光标位于其上时显示,因为它有自己的MouseListener用于绘画。

此外,陈述

frame.add(myComponent);

frame.getContentPane().add(myComponent);

将组件添加到框架的ContentPane&是等价的,但第一个是为方便起见。

请注意,组件不能在BorderLayout中的同一位置共存。您可以将button置于BorderLayout.SOUTH位置(并直接添加到相框中):

frame.add(radio, BorderLayout.SOUTH);

BorderLayout忽略了组件的所有首选大小,因此您必须使用其他布局管理器(例如BoxLayout)来维护固定大小JButton

详细了解Layout Managers

答案 1 :(得分:3)

您正尝试在JButton的默认布局(JRadioButton)中添加BorderLayout按钮和JFrame个对象。

当您将组件添加到具有BorderLayout的JFrame组件时,组件位于中间区域,BorderLayout中心区域倾向于占据整个空间,因此要正确定位元素,您需要指定location以及设置组件的PreferredSize。

frame.add(radio, BorderLayout.SOUTH);
component.setPreferredSize(Dimension);