Java 如何创建带有超链接的复选框 问题:

Java 如何创建带有超链接的复选框 问题:,java,swing,checkbox,hyperlink,jtextpane,Java,Swing,Checkbox,Hyperlink,Jtextpane,我试图在Java中创建一个复选框,该复选框在文本中包含一个超链接 但是,我无法使链接可点击,只有链接,而不是整个文本 下面是我的示例代码: public class TestClickLinkInCheckBox implements MouseListener { private JFrame frame1; private JFrame frame2; private String linkedText = "I have checked the data set

我试图在Java中创建一个复选框,该复选框在文本中包含一个超链接

但是,我无法使链接可点击,只有链接,而不是整个文本

下面是我的示例代码:

public class TestClickLinkInCheckBox implements MouseListener {

    private JFrame frame1;
    private JFrame frame2;
    private String linkedText = "I have checked the data set I have selected, and agree to sign it following <a href=\"http://www.google.com\">the conditions of use of the service, defined in the policies of signature and certification</a> that I attest having read.";
    private JLabel label;

    public TestClickLinkInCheckBox() {
        justCheckBox();
        checkBoxWithLabel();
    }

    private void justCheckBox() throws HeadlessException {
        frame1 = new JFrame();
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));
        JCheckBox checkBox = new JCheckBox(prettyText(linkedText, 300, "left"));
        panel.add(checkBox);
        frame1.add(panel);
    }

    private void checkBoxWithLabel() {
        frame2 = new JFrame();
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));

        JCheckBox checkBox = new JCheckBox();
        panel.add(checkBox);

        label = new JLabel(prettyText(linkedText, 300, "left"));
        label.addMouseListener(this);
        panel.add(label);

        frame2.add(panel);
    }

    private void display() {
        frame1.setVisible(true);
        frame1.pack();
        frame2.setVisible(true);
        frame2.pack();
    }

    public static String prettyText(String badText, int length, String textAlign) {
        return "<html><body width='" + String.valueOf(length) + "px'><div style=\"text-align: " + textAlign + ";\">"+ badText.replace("|||", "<br>") + "</html>";
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getSource() == label) {
            JOptionPane.showConfirmDialog(frame2, "Clicked");
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {}

    public static void main(String[] args) {
        TestClickLinkInCheckBox test = new TestClickLinkInCheckBox();
        test.display();
    }
}
需要理解的一些解释:

  • 我使用JtextPane代替JEditorPane,因为文本不在文本编辑器中包装,我可以用我的html标记来完成
  • 我修改了提供的文本,添加了粗体和下划线标记
    ,并且我还将超链接的颜色更改为普通链接。在另一种情况下,您将有链接,但它将具有与文本相同的颜色
  • 请注意
    HyperlinkListener
    ,它在每次鼠标悬停在链接上时都会生成一个事件,这就是为什么我用对应于“单击”的
    HyperlinkEvent.EventType.ACTIVATED
    过滤事件的原因
  • 将字体大小/样式/颜色更改为整个文本这真的很棘手,你需要使用我的技术,方法
    setFont
    在这里不起作用
享受:)


[EDIT2]需要知道的事情:
  • 如果您使用的是
    Nimbus外观和感觉

    try {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    
有一个错误,你将有一个白色的背景。因此,您需要通过添加这段代码而不是
setBackground()
方法来修复它:

    Color bgColor = panel.getBackground();
    UIDefaults defaults = new UIDefaults();
    defaults.put("TextPane[Enabled].backgroundPainter", bgColor);
    textPane.putClientProperty("Nimbus.Overrides", defaults);
    textPane.putClientProperty("Nimbus.Overrides.InheritDefaults", true);
    textPane.setBackground(bgColor);
绝地武士窗格也一样,但更改行

    defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);

我知道如何使超链接在基本JDK中可单击的唯一方法是使用JEditorPane

因此,您可以创建一个包含两个组件的
JPanel

  • a
    JCheckBox
    (无文本)
  • 带有超链接的
    JEditorPane

  • 您可以轻松地自定义
    JEditorPane
    以使其透明且没有
    边框
    ,因此看起来这两个组件是一个组件。

    这不是一个非常动态或漂亮的解决方案,但您可以使用如下多个标签:

    private String beforeLinkText=“我已经检查了我选择的数据集,并同意在下面签名”;
    私有字符串linkedText=“”;
    private String afterLinkText=“我证明已阅读。”;
    私有无效复选框WithLabel(){
    frame2=新的JFrame();
    JPanel面板=新的JPanel();
    panel.setBorder(BorderFactory.createEmptyByOrder(50,50,50,50));
    JCheckBox checkBox=新的JCheckBox();
    面板。添加(复选框);
    标签=新的JLabel(prettyText(linkedText,400,“左”);
    label.addMouseListener(本);
    JPanel cbTextPanel=newjpanel(newflowlayout(FlowLayout.LEFT));
    cbTextPanel.setPreferredSize(新尺寸(500,70));
    添加(新的JLabel(beforeLinkText));
    cbTextPanel.add(标签);
    添加(新的JLabel(afterLinkText));
    panel.add(cbTextPanel);
    框架2.添加(面板);
    }
    
    是的,它应该可以工作,但它不具有返回到线路的属性,等等。嗨@camickr,感谢您的回复。比JEditorPane更好我选择了更适合我问题的JTextPane。我编辑了我的问题以提供答案。
        defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);