代码之家  ›  专栏  ›  技术社区  ›  Jörg

JOptionPlane中的文本块

  •  0
  • Jörg  · 技术社区  · 5 年前

    以下代码显示了两个具有相同多行html文本的标签。标签 然而,它们的文本定义方式不同:一个是普通字符串,另一个是 作为文本块。 标签按预期显示,即没有任何差异。 OptionPanes使用与标签完全相同的字符串,但文本块 未正确呈现。知道为什么吗?(java版本“16”)

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class TextBlocks extends JFrame {
      public static final long serialVersionUID = 100L;
    
      JButton b1, b2;
      String txt1, txt2;
    
      public TextBlocks() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 240);
    
        txt1= "<html>"+
            "<h3><font color=fuchsia>Caption</font></h3><font size=3>"+
            "Lorem ipsum dolor sit amet, consectetur adipisici elit,<br>"+
            "sed do eiusmod tempor incidunt ut labore et dolore<br><br>"+ 
            "<h3>Topic 1</h3><font size=3>"+
            "Lorem ipsum dolor sit amet, consectetur adipisici elit,<br>"+
            "sed do eiusmod tempor incidunt ut labore et dolore magna<br>"+
            "aliqua. Ut enim ad minim veniam, quis nostrud<br><br>"+
            "<h3>Topic 2</h3><font size=3>"+
            "Lorem ipsum dolor sit amet, consectetur adipisici elit,<br>"+
            "sed do eiusmod tempor incidunt ut labore et dolore magna<br>"+
            "aliqua. Ut enim ad minim veniam, quis nostrud exercita-<br>"+
            "tion ullamco laboris nisi ut aliquid ex ea commodi</html>";
        JLabel lb= new JLabel(txt1);
        add(lb, BorderLayout.WEST);
        txt2= """
        <html><h3><font color=fuchsia>Caption</font></h3><font size=3>
        Lorem ipsum dolor sit amet, consectetur adipisici elit,<br>
        sed do eiusmod tempor incidunt ut labore et dolore<br><br>
        <h3>Topic 1</h3><font size=3>
        Lorem ipsum dolor sit amet, consectetur adipisici elit,<br>
        sed do eiusmod tempor incidunt ut labore et dolore magna<br>
        aliqua. Ut enim ad minim veniam, quis nostrud<br><br>
        <h3>Topic 2</h3><font size=3>
        Lorem ipsum dolor sit amet, consectetur adipisici elit,<br>
        sed do eiusmod tempor incidunt ut labore et dolore magna<br>
        aliqua. Ut enim ad minim veniam, quis nostrud exercita-<br>
        tion ullamco laboris nisi ut aliquid ex ea commodi</html>
        """;
        lb= new JLabel(txt2);
        add(lb, BorderLayout.CENTER);
    
        JPanel p= new JPanel();
        b1= new JButton("JOptionPane with text 1");
        ActionListener listener= new ActListener();
        b1.addActionListener(listener);
        p.add(b1);
        b2= new JButton("JOptionPane with text 2");
        b2.addActionListener(listener);
        p.add(b2);
        add(p, BorderLayout.SOUTH);
        pack();
        setVisible(true);
      }
    
    
      static public void main(String args[]) {
        EventQueue.invokeLater(TextBlocks::new);
      }
    
    
      class ActListener implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
          String buf= evt.getSource()==b1 ? txt1 : txt2;
          JOptionPane.showMessageDialog(TextBlocks.this, buf, "Demo",
                        JOptionPane.INFORMATION_MESSAGE);
        }
      }
    
    }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Yassin Hajaj    5 年前

    尾随车厢返回 txt2 使文本块无法由您管理 JOptionPane ,相反,通过使用 \ 每行末尾

    txt2 = """
            <html><h3><font color=fuchsia>Caption</font></h3><font size=3> \
            Lorem ipsum dolor sit amet, consectetur adipisici elit,<br> \
            sed do eiusmod tempor incidunt ut labore et dolore<br><br> \
            <h3>Topic 1</h3><font size=3> \
            Lorem ipsum dolor sit amet, consectetur adipisici elit,<br> \
            sed do eiusmod tempor incidunt ut labore et dolore magna<br> \
            aliqua. Ut enim ad minim veniam, quis nostrud<br><br> \
            <h3>Topic 2</h3><font size=3> \
            Lorem ipsum dolor sit amet, consectetur adipisici elit,<br> \
            sed do eiusmod tempor incidunt ut labore et dolore magna<br> \
            aliqua. Ut enim ad minim veniam, quis nostrud exercita-<br> \
            tion ullamco laboris nisi ut aliquid ex ea commodi</html> \
            """;
    

    这将产生以下结果

    enter image description here

        2
  •  1
  •   Yevgen    5 年前

    JOptionPane 使用 JLabel 渲染文本,后者是设计的 to display a single line text 只有。因此,问题不在于使用文本块,事实上,如果你在文本块中添加换行符 txt1 字符串,您将观察到相同的行为。

    但是,可以在中显示多行文本 标签类 ,必须使用html并避免任何换行符。

    String example = """
      <html>
      <h1>Example</h1><br>
      <p>A line</p>
      </html> 
        """.replace("\n", "");