Kode berikut menunjukkan dua label dengan teks HTML multilin yang sama. Label berbeda, bagaimanapun, dengan cara teks mereka didefinisikan: satu sebagai string biasa, yang lain sebagai blok teks. Label ditampilkan seperti yang diharapkan, yaitu tanpa perbedaan. Opsipanes menggunakan string yang sama dengan label, tetapi blok teks tidak diterjemahkan dengan benar. Adakah yang tahu mengapa? (Versi 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);
    }
  }

}
1
Jörg 5 April 2021, 00:50

2 jawaban

Jawaban Terbaik

Trailing Carriage kembali dalam txt2 membuat blok teks tidak dapat dikelola oleh JOptionPane Anda, bukan secara eksplisit mempertimbangkan blok teks sebagai satu-liner dengan menggunakan \ pada akhir setiap baris

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> \
        """;

Ini menghasilkan yang berikut

enter image description here

1
Yassin Hajaj 4 April 2021, 23:06

JOptionPane menggunakan JLabel untuk membuat teks dan yang terakhir dirancang untuk menampilkan satu teks baris saja. Dengan demikian masalah ini tidak datang dari menggunakan blok teks, sebenarnya jika Anda menambahkan garis baru ke string txt1, Anda akan mengamati perilaku yang sama.

Namun, teks multilin dapat ditampilkan dalam JLabel, seseorang harus menggunakan HTML dan menghindari simbol baris baru.

String example = """
  <html>
  <h1>Example</h1><br>
  <p>A line</p>
  </html> 
    """.replace("\n", "");
1
Eugene 5 April 2021, 01:31