JToggleButton组件无论setSize设置成多少,都会被拉伸以填满整个JFrame
我想创建一个简单的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() );
}
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。