2015-08-13 43 views
0

我已經看過這麼多的線程,並沒有人幫助過我。 這裏是我的代碼:我如何使這個自定義JButton工作?

package myProjects; 

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.awt.geom.*; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 

public class LukeButton extends JButton{ 
public static void main(String[] args){ 
    JFrame frame = new JFrame(); 
    frame.setTitle("Luke"); 
    frame.setSize(300, 300); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    LukeButton lb = new LukeButton("Text"); 
    lb.addActionListener(e->{ 
     System.out.println("Clicked"); 
    }); 

    frame.setVisible(true); 
} 
public LukeButton(String text){ 

} 
public void paint(Graphics g){ 
    Graphics2D g2 = (Graphics2D)g; 

    Shape rec = new Rectangle2D.Float(10, 10, 60, 80); 

    g2.setColor(Color.BLACK); 
    g2.setStroke(new BasicStroke(2)); 
    g2.draw(rec); 
    g2.setColor(Color.BLUE); 
    g2.fill(rec); 
    } 
} 

這應該是那裏的矩形,是不是。我不知道擴展JButton時不允許這樣做,但如果不是,我不知道如何解決它。有沒有人有辦法解決嗎?

回答

3

一個主要問題:您不要將LukeButton實例添加到GUI。解決方案:通過容器的add(lb)方法添加它。

public static void main(String[] args) { 
    LukeButton lb = new LukeButton("Text"); 
    JPanel panel = new JPanel(); 
    panel.add(lb); 

    JFrame frame = new JFrame(); 
    frame.add(panel); 

其他問題:

  • 你應該覆蓋paintComponent方法不paint方法
  • 調用超類的方法的paintComponent在覆蓋
  • 覆蓋你的組件的調用getPreferredSize。
  • 不要忽略傳遞到構造函數參數中的字符串。你可能想把它傳遞給super的構造函數。
  • 你可能比使用繼承去做任何你想做的事情要好得多,也就是不要擴展JButton。如果你能給我們更詳細的整體問題,我們可以提供幫助。
+0

謝謝,它現在可以工作,我無法相信那經歷過我!而對於構造函數中的參數,我將使用該按鈕上的文本,但只是還沒有完成它:)再次感謝。 –

+0

我讀過你的編輯,我的目標是有一個按鈕(我現在擁有的那個很好),我可以用它來代替枯燥的JButton。但我真的不知道如何解決這個問題。 –