2016-04-07 42 views
1

Sorunumu göstermek için bir SSCCE oluşturdum. Çok güzel bir şekilde sarılmış çok katmanlı bir JLabel'ım var, fakat bir JFrame'e paketlendiğinde, satır kaydırma nedeniyle gereken ekstra yükseklik dikkate alınmıyor, böylece pencerenin kaydırılması veya yeniden boyutlandırılması gerekiyor. Öyle gibi doğru boyutu ile başlatılmasını mümkün için pencereyi tercih ediyorumÇok satırlı JLabel düzgün bir şekilde paketlenmiyor

enter image description here

: Burada yaratma anda penceredir

enter image description here

Ben dolgu her birlikte çalıştılar, büyüme , span, minimum, tercih edilen, maksimum, vb. ancak istediğim davranışı alamıyorum. Ayrıca JTextAreas ile deney yaptım, ama bana JLabels'den daha fazla sorun verdiler. Mutlaka sizin Jpanel içindeki tüm içeriğini değiştirmek gerekmez

package SSCCE; 

import net.miginfocom.swing.MigLayout; 
import java.awt.*; 
import javax.swing.*; 
import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS; 
import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS; 

public class App 
{ 
    public static void main(String[] args) { 
     App program = new App(); 
     SwingUtilities.invokeLater(program::run); 
    } 

    private void run() { 
     JFrame w = new JFrame(); 
     w.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 



     // "main" shall contain everything to be packed into the JFrame. 
     JPanel main = new JPanel(); 
     main.setLayout(new MigLayout(
       "debug", 
       "[][][][][]", // cols 
       "[][][fill, grow]" // rows 
     )); 

     // First row (search UI) 
     main.add(new JLabel("Chinese character:"), "spany 2"); 
     main.add(new JTextField("type here"), "growx, spanx 3"); 
     main.add(new JButton("Search"), "spany 2, wrap"); 

     // Second row (checkboxes) 
     main.add(new JCheckBox("box1")); 
     main.add(new JCheckBox("box2")); 
     main.add(new JCheckBox("box3"), "wrap"); 



     // Third row setup: a 'content' JPanel to be viewed by a JScrollPane, the latter which is to be added to the main JPanel. 
     JPanel content = new JPanel(); 
     content.setLayout(new MigLayout(
       "debug, wrap 4", 
       "[left][][][fill, grow]", // cols 
       "[top][fill]" // rows 
     )); 

     // First row of 'content' JPanel: The multi-line JLabel which wraps beautifully but doesn't pack properly. 
     JLabel tutorial = new JLabel("<html>" + 
       "**WELCOME**<br>This is an English-language interface for the Chinese character etymology search engine  'XiaoXue', " + 
       "produced by the Taiwanese academic institution Academia Sinica (中央研究院).<br> NOTE: if the text  between " + 
       "those brackets doesn't display, Chinese language support is not configured on your computer." + 
       "<br><br>" + 
       "**HOW TO USE**<br>Simply enter a single Chinese character into the search field and press 'enter' or  the " + 
       "Search button. The checkboxes below the search field are non-operational and merely proof-of-concept  for a future capability to " + 
       "combine resources from different databases.<br>NOTE: supports traditional Chinese characters (and those  shared with Japanese), " + 
       "but not simplified." 
       + "</html>"); 
     tutorial.setPreferredSize(new Dimension(1,1)); // This encourages the JLabel to wrap. 
     content.add(tutorial, "grow, spanx 4"); 

     // Second row of 'content' JPanel: 
     content.add(new JLabel("label1"), ""); 
     content.add(new JLabel("label2"), ""); 
     content.add(new JLabel("label3"), ""); 
     content.add(new JLabel("label4"), ""); 

     // JScrollPane view of the 'content' JPanel 
     JScrollPane contentScrollPane = new JScrollPane(content, VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_ALWAYS); 
     contentScrollPane.getVerticalScrollBar().setUnitIncrement(20); 
     contentScrollPane.getHorizontalScrollBar().setUnitIncrement(50); 

     // Third row finally added to main JPanel. 
     main.add(contentScrollPane, "span, width :100%:"); 



     w.add(main); 
     w.pack(); 
     w.setVisible(true); 
    } 
} 

cevap

-1

:

İşte benim tek dosya SSCCE bu. JFrame'in boyutunu sadece başlangıçtan değiştirebilirsiniz. JFrame'in boyutunu değiştirmek için w.setSize(200, 400); veya bunun gibi bir şey koymayı deneyin.

Başka bir çözüm de w.pack() kullanmak olacaktır ancak bunun işe yarayıp yaramadığından emin değilim.

+0

Daha çok dinamik bir çözüm arıyorum. Pencereyi sistemimde doğru şekilde paketlemek için gereken boyut mutlaka platformlar arasında değişecektir ve yine de metni değiştirdiğimde yeniden hesaplamak istemiyorum. –

+0

'setSize()' yöntemini kullandığınızda, otomatik olarak yeniden boyutlandırılmaz ('pack()' yöntemini kullanmadıysanız. 'SetResizable (false)' yöntemini de kullanabilirsiniz. Ekran çözünürlüğünü bilgisayardan almak ve bununla çalışmak isteyebilirsiniz: – Eames

+1

Buna dikkat edin [pitfall] (http://stackoverflow.com/a/12532237/230513). – trashgod