【问题标题】:Insert Button in JPanel在 JPanel 中插入按钮
【发布时间】:2016-05-16 12:00:25
【问题描述】:

我在 Java 中使用 swing,我需要创建一个 JButton 并将其放入 JPanel。

我学习了教程,然后我做到了:

public void crearNuevaMiga(String nombre)
{
    JButton nuevo = new JButton(nombre);
    this.MigasDePan.add(nuevo);
    nuevo.setVisible(true);
    nuevo.setLocation(new Point(migaX, migaY));
    System.out.println(nuevo.getLocation().x + " "+ nuevo.getLocation().y);
    migaX = migaX-avanceMigas;
}

我这样做了,当我调用该函数时,我看不到按钮。我在 NetBeans 的设计器上放置了一个按钮并获得 X 和 Y 位置。然后,在变量 migaX 和 migaY 中,我把那个 X 和 Y 位置,所以按钮需要在同一个位置,但它不存在。

有人知道为什么吗?也许这样放置位置不正确?

感谢您的宝贵时间!

编辑:MigasDePan 是我的 JPanel

【问题讨论】:

  • 在添加按钮并设置其位置后尝试调用this.MigasDePan.repaint();
  • 不,重绘不起作用:/
  • 您的错误在于使用 NetBeans 设计器。在您手工完成数百个 GUI 并理解 Swing architecture 之前,您将遇到问题。

标签: java swing jpanel jbutton


【解决方案1】:

默认情况下,组件的大小为 (0, 0),因此无需绘制任何内容。

当您将按钮动态添加到可见 GUI 时,您需要调用布局管理器,以便布局管理器可以确定组件的大小/位置。

基本代码是:

panel.add(...);
panel.revalidate();
panel.repaint();

【讨论】:

    【解决方案2】:

    这是一个简单的例子,将 JButton 放入 JPanel,并将 JPanel 放入 JFrame。我在没有使用任何 GUI 构建器的情况下创建了这段代码。

    1. 我在main方法中调用了SwingUtilities的invokeLater方法,把Swing组件的创建和使用放到Event Dispatch thread上。 Oracle 和我坚持让您在 Event Dispatch 线程上启动每个 Swing 应用程序。

    2. 我使用了 JFrame。您必须按照在 run 方法中调用 JFrame 方法的顺序调用它们。

    3. 我使用了 JPanel。我把 JButton 放在 JPanel 的中间,因为它是 JPanel 上唯一的组件。

    4. 我使用了Swing layout,即边框布局。不同的 Swing 布局用于创建不同的 Swing 组件布局。

    这是简短、独立、可运行的代码。

    package com.ggl.testing;
    
    import java.awt.BorderLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class MyButton implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new MyButton());
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("My Button");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(createMainPanel());
            frame.pack();
            frame.setVisible(true);
        }
    
        private JPanel createMainPanel() {
            JPanel panel = new JPanel();
            panel.setLayout(new BorderLayout());
    
            JButton myButton = new JButton("My Button");
            panel.add(myButton);
    
            return panel;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-26
      • 2012-03-25
      • 2012-09-09
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多