添加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();
}
这是每个调整后的样子:
我创建了一个带有 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(); }
这是每个调整后的样子: