如何使这个自定义JButton工作?

时间:2015-08-13 21:23:09

标签: java swing 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时是否允许这样做,但如果不是,我不知道如何解决它。有没有人有解决方案?

1 个答案:

答案 0 :(得分: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方法
  • 在覆盖
  • 中调用super的paintComponent方法
  • 覆盖组件的getPreferredSize。
  • 不要忽略传递给构造函数参数的String。您可能希望将其传递给超级构造函数。
  • 你最好不要使用继承来做你想做的事情,也就是说,不要扩展JButton。如果您可以向我们提供有关整体问题的更多详细信息,我们可以提供帮助。