【问题标题】:How to use a JPanel as JButton?如何将 JPanel 用作 JButton?
【发布时间】:2016-10-10 17:56:45
【问题描述】:

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

最通用的解决方案是什么?

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

【问题讨论】:

  • 在这种情况下我不会使用这个设计师:)。为什么必须使用它?
  • 我们的开发指南定义我们必须使用 UI 设计器来处理任何图形摇摆的东西:-/
  • 支持所有swing组件的设计师非常多。例如 NetBeans IDE。 Eclipse 也有一个用于 UI 图形设计的插件。但恕我直言,使用设计师是个坏主意(至少在您学习挥杆时)。
  • NetBeans 是否允许您创建自定义按钮(使用 ui 设计器)?

标签: java swing


【解决方案1】:

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

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

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);
    }

}

【讨论】:

    【解决方案2】:

    只需添加MouseListener

    JPanel jp = new JPanel();
    jp.addMouseListener(new MouseAdapter(){
        public void mouseClicked(MouseEvent e) {
            System.out.println("Clicked");
        }
    
    });
    

    如果这个答案不够具体,请发表评论,我会给你更多解释。

    【讨论】:

    • 鼠标监听只覆盖鼠标交互,如果是键盘按键呢?图形“按下”效果怎么样?
    • 对于键盘,添加KeyboardListener以获得图形效果,您可以实现用于JButton的图形,这没有意义。在 Java Swing 中编写 GUI 很容易。无需设计器工具即可编写。
    • @xenteros 您至少应该为面板设置适当的边框,否则用户无法理解它是一个按钮..
    • @SergiyMedvynskyy 我不关心设计,因为它是基于主要意见的。我已经回答了问题的技术部分。
    • @SergiyMedvynskyy Those panels (they basically contain complex button designs) to work like a JButton.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2011-05-06
    • 2013-05-04
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多