2016-04-18 125 views
1

我有我插入了20個組件(JLabels)的JTextPane。不幸的是,所有的標籤都在一條線上。JTextPane - 自動換行插入JLabel組件

我該如何強制JTextPane自動包裝插入的對象?

enter image description here

package texteditor; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 

public class JTextPaneExample extends JPanel { 

    private JTextPane tp; 

    public JTextPaneExample() { 
     setLayout(new BorderLayout(0, 0)); 

     JPanel panel = new JPanel(); 
     add(panel, BorderLayout.CENTER); 
     panel.setLayout(new BorderLayout(0, 0)); 

     JScrollPane scrollPane = new JScrollPane(); 
     panel.add(scrollPane, BorderLayout.CENTER); 

     tp = new JTextPane(); 
     tp.setEditable(false); 
     scrollPane.setViewportView(tp); 

     for (int i = 0; i < 20; i++) { 
      JLabel lbl = new JLabel("AAAA "); 
      lbl.setOpaque(true); 
      lbl.setBorder(BorderFactory.createLineBorder(Color.black, 1)); 
      tp.insertComponent(lbl); 
     } 
    } 


    public static void main(String[] args) { 
     JFrame frame = new JFrame("GoBoard"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new JTextPaneExample()); 
     frame.setPreferredSize(new Dimension(400, 400)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

回答

2

JTextPane包裝空間。您的文檔沒有任何空格,因此沒有任何內容可以打包。您可以在標籤之間添加一個空格:

for (int i = 0; i < 20; i++) { 
    JLabel lbl = new JLabel("AAAA "); 
    lbl.setOpaque(true); 
    lbl.setBorder(BorderFactory.createLineBorder(Color.black, 1)); 
    tp.insertComponent(lbl); 
    doc.insertString(doc.getLength(), " ", null); 
    tp.setCaretPosition(doc.getLength()); 
} 

此外,仍然不確定爲什麼要使用JTextPane進行此操作。您可以使用JPanel並將面板上的組件換行到下一行。請參閱Wrap Layout瞭解使用此方法的解決方案。

這也應該使您最後一個問題(JTextPane - get component values)的解決方案更容易,因爲您將處理的實際組件不需要搜索文檔以獲取點擊標籤。

1

你需要使用一個LayoutManager,在這種情況下,你可能想/必須建立自己的佈局管理(我不得不前因類似的問題幾年做到這一點)。在您的LayoutManager layoutComponent方法中,檢查標籤的索引以及之前所有組件的所有preferredsize.width/size.width的長度。如果這大於JTextPane的preferredsize.width/size.width,請將其移至下一行。

+0

使用'BorderLayout'將JTextPane添加到容器中,然後將其添加到'JScrollPane'「應該」具有所需的效果(至少它對我來說是過去的) – MadProgrammer

+0

我會好奇的看到你的最終解決方案請在論壇中發帖。我從來沒有見過在JTextPanel中使用佈局管理器。如果您在JTextPane中使用佈局管理器,我問爲什麼您甚至使用JTextPane。看起來像是一個奇怪的解決方案給我。 – camickr

+0

@MadProgrammer,我想我在這個問題上吃午飯。我不明白答案或你的建議。我已經用你的方法來「防止」過去的包裝。請參閱[無包裝文本窗格](https://tips4java.wordpress.com/2009/01/25/no-wrap-text-pane/)。當我使用我的建議(它包裝),然後添加您的建議沒有包裝。 – camickr