添加JTextPane后什么时候按钮不起作用?

Whe does button not work after adding JTextPane?

我创建了一个带有 JTextPane 的按钮。 当我将 JTextPane 添加到 JButton 时,我无法单击该按钮。 当我删除 JTextPane 时,我可以单击按钮。 有人知道如何解决这个问题吗?

public class BtnOrderFefcoStyle extends JButton {
    
        private final static String NAME_FONT = "ARIAL";
        private final static boolean IS_BOLD = true;
        private final static int SIZE_FONT = 18;
        private final static Color NAVY_COLOR = new Color(0 , 51 , 102)
        private final static int BUTTON_WIDTH  = 122;
        private final static int BUTTON_HEIGHT = 64;
        private final static int BORDER_THICKNESS = 2;
        private int posX , posY;


        public BtnOrderFefcoStyle(int pos_x , int pos_y) 
        {
            super() ;   
            this.posX = pos_x;
            this.posY= pos_y;
            setOpaque(false);
            setBorderPainted(false);
            setContentAreaFilled(false);
            setFocusable(false);
            setEnabled(true);
            setBorder(null);
            setBounds(pos_x, pos_y, BUTTON_WIDTH, BUTTON_HEIGHT);
            setForeground(Color.WHITE);

            
            JTextPane nameBtn = new JTextPane();
            nameBtn.setEditable(false);
            nameBtn.setText("ADD TO LIST");
            nameBtn.setAutoscrolls(true);
            nameBtn.setEnabled(false);
            nameBtn.setOpaque(false);
            
            SimpleAttributeSet attribs = new SimpleAttributeSet();
            StyleConstants.setAlignment(attribs, StyleConstants.ALIGN_CENTER);
            StyleConstants.setFontFamily(attribs, NAME_FONT);
            StyleConstants.setBold(attribs, IS_BOLD);
            StyleConstants.setFontSize(attribs, SIZE_FONT);
            
            nameBtn.setParagraphAttributes(attribs, true);
            nameBtn.setCaretPosition(1);
            nameBtn.setParagraphAttributes(attribs, true);
            nameBtn.setDisabledTextColor(NAVY_COLOR);
            //nameBtn.setBackground(new Color(153 , 153, 153));
            nameBtn.setSize(BUTTON_WIDTH - 2 * BORDER_THICKNESS  , BUTTON_HEIGHT - 2 * BORDER_THICKNESS);
            //nameBtn.setForeground(NAVY_COLOR);
            add(nameBtn);   
        }

        @Override
        protected void paintComponent(Graphics g) 
        {
            // TODO Auto-generated method stub
            super.paintComponent(g);
            g.setColor(Color.WHITE);
            g.fillRect(0 , 0 , BUTTON_WIDTH, BUTTON_HEIGHT);
            g.setColor(Color.GRAY);
            g.fillRect(BORDER_THICKNESS , BORDER_THICKNESS , BUTTON_WIDTH - 2 * BORDER_THICKNESS , BUTTON_HEIGHT  - 2 * BORDER_THICKNESS );
        }   
}

一个MouseEvent被传递给被点击的组件。如果您将 JTextPane 添加到 JButton,则您单击的是文本窗格,而不是按钮。

您可以尝试从 JTextPanel 中删除 MouseListeners

for (MouseListener ml: textPane.getListeners(MouseListener.class))
    textPane.removeMouseListener( ml );

不确定您是否还需要删除 MouseMotionListener。

您当前的示例中发生的情况是:

您的 JTextPane 被放置在您的 JButton 之上,当您从 JButton 移除边框时,它占用了所有可用的 space,所以您一直重新点击 JTextPane

如果我们给 JTextPane 添加边框,这就是我们在删除 JButton 的边框之前和删除

之后得到的结果

要解决此问题,您可以:

  • JTextPane后加一个MouseListener,例如:

    nameBtn.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
             super.mouseClicked(e);
             System.out.println("Clicked on nameBtn");
         }
    });
    
  • 按照上面评论中的建议创建一个使用 HTML 的方法:

      private String getButtonString(String stringFromFile) {
          StringBuilder sb = new StringBuilder();
          sb.append("<html><body><p>");
          sb.append(stringFromFile);
          sb.append("</p></body></html>");
          return sb.toString();
    }
    

这是每个调整后的样子: