如何将 JPanel 用作 JButton?

gor*_*tde 1 java swing

我必须使用 swing-ui 设计器工具来创建我的 UI,该工具仅支持图形编辑 JPanel。这些面板(它们基本上包含复杂的按钮设计)像 JButton 一样工作。我不能使用 JPanel 以外的任何东西作为这些面板的基类(UI 编辑器限制)。

执行此操作的最通用的解决方案是什么?

  • 创建一个使用面板的绘制方法而不是它自己的自定义按钮?
  • 创建一个重新实现整个按钮的基础面板类?
  • 另一个更优雅的解决方案?

Arn*_*aud 5

这是一个快速演示,向您展示如何使用边框来模拟按钮。

该演示还对鼠标和按键事件做出反应:

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

public class JPanelButton extends JPanel {

    Border raisedetched = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
    Border loweredetched = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);

    public static void main(final String[] args) {

        JFrame frame = new JFrame();

        final JPanelButton panel = new JPanelButton();
        panel.raiseBorder();

        panel.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(final MouseEvent e) {
                panel.lowerBorder();

            }

            @Override
            public void mouseReleased(final MouseEvent e) {
                panel.raiseBorder();

            }

        });

        panel.setFocusable(true); // you need this or the panel won't get the key events
        panel.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(final KeyEvent e) {
                panel.lowerBorder();

            }

            @Override
            public void keyReleased(final KeyEvent e) {
                panel.raiseBorder();

            }
        });

        frame.setContentPane(panel);
        frame.setSize(100, 100);
        frame.setVisible(true);

    }

    public void raiseBorder() {

        setBorder(raisedetched);
    }

    public void lowerBorder() {

        setBorder(loweredetched);
    }

}
Run Code Online (Sandbox Code Playgroud)