2016-05-16 143 views
0

我在Java中使用swing,我需要創建一個JButton並將其放入JPanel。在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

+0

嘗試調用'this.MigasDePan.repaint();'添加按鈕,並設置其位置之後。 – Hackerdarshi

+0

不,重繪不起作用:/ – Transy

+0

您的錯誤是使用NetBeans設計器。在您手動完成幾百個GUI之前,並瞭解[Swing體系結構](https://docs.oracle.com/javase/tutorial/uiswing/)之前,您將遇到問題。 –

回答

1

默認情況下,組件的大小爲(0,0),所以沒有東西可以繪製。

當您動態地將按鈕添加到可見的GUI時,您需要調用佈局管理器,以便佈局管理器可以確定組件的大小/位置。

基本代碼是:

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

這裏是把一個JButton在一個JPanel,並把JPanel的一個JFrame的一個簡單的例子。我創建了這個代碼,而不使用任何GUI構建器。

  1. 我打電話的主要方法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; 
    } 

}