Java 添加JTextPane后按钮何时不工作?

Java 添加JTextPane后按钮何时不工作?,java,swing,jbutton,jtextpane,Java,Swing,Jbutton,Jtextpane,我创建了一个按钮,里面有JTextPane。 当我将JTextPane添加到JButton时,我无法单击该按钮。 当我删除JTextPane时,我可以单击按钮。 有人知道如何解决这个问题吗 public class BtnOrderFefcoStyle extends JButton { private final static String NAME_FONT = "ARIAL"; private final static bool

我创建了一个按钮,里面有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中删除鼠标侦听器

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

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

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

您的
JTextPane
被放置在
JButton
的顶部,当您从
JButton
中删除边框时,它占用了所有可用空间,因此您一直在点击
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();
    }
    
    私有字符串getButtonString(字符串stringFromFile){
    StringBuilder sb=新的StringBuilder();
    sb.追加(“”);
    某人追加(stringFromFile);
    sb.追加(“

    ”); 使某人返回字符串(); }
这是调整大小时它们的外观:


您的代码在哪里?您是否可以展示您的代码并解释为什么要将JTextPane添加到JButton?您可以在没有JTextPane的情况下在JButton上显示文本。我希望将文本包装在按钮上,这就是我使用JTextPane的原因。否则,当我用JButton的构造函数将文本框起来时,我看不到文本,因为我使用了paintComponent propablyBut,但如果这是您唯一的愿望,让文本换行,那么为什么要让它这么复杂呢?这可以通过JButton的内置函数轻松完成。检查。您还可以使用默认的JButton行为更改显示文本的字体。我知道我可以使用ex.HTML lang。但是我想插入没有任何特殊符号的原始文本。将来我将从一个文件中导入文本。