Java 如何适当调整自定义组件的大小?

Java 如何适当调整自定义组件的大小?,java,swing,Java,Swing,所以我有一个自定义按钮,运行良好,没有错误 代码如下: import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; public class LukeButton extends JCompon

所以我有一个自定义按钮,运行良好,没有错误

代码如下:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class LukeButton extends JComponent implements MouseListener{
    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();
        lb.addActionListener(e->{
            System.out.println("Success");
        });
        frame.add(lb, BorderLayout.CENTER);

        frame.setVisible(true);
    }
//ArrayList of listeners
private final ArrayList<ActionListener> listeners = new ArrayList<ActionListener>();

public LukeButton(){
    this.addMouseListener(this);
}
//Adds a listeners to the list
public void addActionListener(ActionListener e){
    listeners.add(e);
}
//Called when button is provoked
public void fireActionListeners(){
    if(!listeners.isEmpty()){
        ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "LukeButton");
        for(ActionListener l: listeners){
            l.actionPerformed(evt);
        }
    }
}
//Listens for click on my component
public void mousePressed(MouseEvent e){
    fireActionListeners();
}
public Dimension getPreferredSize(){
    return new Dimension(100, 100);
}
//Draws my button
public void paintComponent(Graphics g){

    super.paintComponent(g);

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

    g2.setColor(Color.BLACK);
    g2.setStroke(new BasicStroke(5));
    g2.draw(rec);
    g2.setColor(Color.BLUE);
    g2.fill(rec);
}
//Methods that must be over written.
public void mouseClicked(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.*;
导入java.util.ArrayList;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
公共类LukeButton扩展JComponent实现MouseListener{
公共静态void main(字符串[]args){
JFrame=新JFrame();
框架。片名(“路加”);
框架。设置尺寸(300300);
frame.setLocationRelativeTo(空);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
LukeButton lb=新LukeButton();
lb.addActionListener(e->{
System.out.println(“成功”);
});
添加框架(lb,边框布局。中心);
frame.setVisible(true);
}
//侦听器数组列表
私有最终ArrayList侦听器=新ArrayList();
公共卢克布顿(){
这个。addMouseListener(这个);
}
//将侦听器添加到列表中
public void addActionListener(ActionListener e){
添加(e);
}
//触发按钮时调用
public void fireActionListeners(){
如果(!listeners.isEmpty()){
ActionEvent evt=新的ActionEvent(这是ActionEvent.ACTION_执行的“LukeButton”);
for(ActionListener l:侦听器){
l、 执行的行动(evt);
}
}
}
//侦听是否单击我的组件
公共无效鼠标按下(MouseEvent e){
fireActionListeners();
}
公共维度getPreferredSize(){
返回新维度(100100);
}
//画我的按钮
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
Shape rec=新矩形2D.浮动(10,10,60,80);
g2.设置颜色(颜色为黑色);
g2.设定行程(新基本行程(5));
g2.绘制(rec);
g2.setColor(颜色为蓝色);
g2.填充(rec);
}
//必须重写的方法。
公共无效mouseClicked(MouseEvent e){
}
公共无效鼠标事件(鼠标事件e){
}
公共无效mouseExited(MouseEvent e){
}
公共无效MouseEvent(MouseEvent e){
}
}

这是我的主要问题——当我在JFrame上点击任何地方时,它都会说按钮被点击了,但我唯一想让action listener打开的部分是我在JFrame上的蓝色矩形。(如果你运行我的程序,你会理解我的问题)有人知道如何解决这个问题吗?感谢您花时间阅读:)

更改您的
鼠标按下的方法,以便它首先检查单击点是否被蓝色矩形包围。只需要一个简单的if块。注意:不要在paintComponent内部创建矩形。如果它是常量,则在类中声明并创建它,以便可以在
mousePressed
方法中使用它。还要注意的是,矩形2D有一个
包含(…)
的方法,它将对您的帮助很大。还要注意的是,MouseeEvent有一个
getPoint()
方法,该方法也将对您的帮助很大


另外,要调整按钮的大小,请按照我在您的应用程序中的建议,重写其
getPreferredSize()
方法。另外,避免在JFrame或任何组件上调用
setSize()。另外,在显示JFrame之前,
pack()
您的JFrame。

谢谢,我不知道这两种方法。当然,我还有一些小问题要解决,但我还是把它留给我自己:)