JToggleButton组件无论setSize设置成多少,都会被拉伸以填满整个JFrame

编程语言 2026-07-10

我想创建一个简单的Java Swing应用程序,带有一个自定义绘图画布和一组 JToggleButton 控件。然而,按钮现在会拉伸覆盖整个窗口,遮挡了我的画布和彼此之间。

我已经尝试使用 btn.setSize(10, 10),但按钮仍然扩展以填满整个框架。我怀疑这与默认的布局管理器有关,但我不确定如何把它们排列整齐(例如横向排成一排),同时又不覆盖 MyCanvas 组件。

代码:

代码:

import java.awt.*;
import javax.swing.*;

class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 525);

        // Custom canvas
        MyCanvas canvas = new MyCanvas();
        frame.add(canvas);

        // Group for buttons
        ButtonGroup buttonGroup = new ButtonGroup();

        // Creating buttons
        createButton("move", frame, buttonGroup);
        createButton("grass", frame, buttonGroup);
        createButton("water", frame, buttonGroup);
        createButton("hole", frame, buttonGroup);
        createButton("mountain", frame, buttonGroup);

        frame.setVisible(true);
    }

    private static JToggleButton createButton(String btnname, JFrame frame, ButtonGroup buttonGroup) {
        JToggleButton btn = new JToggleButton(btnname);
        btn.setSize(10, 10); // This doesn't seem to affect the size
        buttonGroup.add(btn);
        frame.add(btn); // Adding directly to frame seems to cause the overlap/fill issue
        return btn;
    }
}

// Placeholder for the canvas class
class MyCanvas extends JComponent {
    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, getWidth(), getHeight());
    }
}

我也尝试用 setSize 手动调整它们,但似乎没起作用。

解决方案

只需做几处小改动,您的代码就能跑起来...

public class MyClass {

   void test() {

        // it is "fundamental" to create the "GUI" on the event
        // thread, so we avoid random behaviors, difficult to
        // locate and correct
      SwingUtilities.invokeLater( () -> { 
         JFrame frame = new JFrame();
         frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
         frame.setSize( 500, 525 );

           // we assign the frame a "BorderLayout"
         frame.setLayout( new BorderLayout() );

         MyCanvas canvas = new MyCanvas();

           // we create a "JPanel" without assigning it a layout,
           // so it will use the default layout ("FlowLayout")
         JPanel pan = new JPanel();

         ButtonGroup buttonGroup = new ButtonGroup();

           // since we have modified the method, we invoke it
           // only once with all the parameters
         createButton( pan, buttonGroup, "move", "grass", "water", "hole", "mountain" );

           // add the panel at the top
         frame.add( pan, BorderLayout.NORTH );

         frame.add( canvas );
         frame.setVisible( true );
      });
   }

   private void createButton( JPanel panel, ButtonGroup buttonGroup, String... btnnames ) {
      for( String btnname : btnnames ) {
         JToggleButton btn = new JToggleButton( btnname );
         buttonGroup.add( btn );
         panel.add( btn );     
      }
   }

   public static void main( String[] args ) {
      new PruebasCortas().test();
   }
}

Canvas 类中,我们使用一个 Graphics2D 对象来进行“绘制”:

class MyCanvas extends JComponent { 

   @Override
   public void paintComponent( Graphics g ) {
      super.paintComponent( g );
      Graphics2D g2d = (Graphics2D) g;
      g2d.setColor( Color.WHITE );
      g2d.fillRect( 0, 0, getWidth(), getHeight() );
   }
}

更多信息请参阅以下链接: - border教程 - flow教程

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章