2013-01-06 48 views
3

這是一個使用miglayout的swing中簡單記事本的代碼。我已經使用了span和grow來填充水平空間,但填充和增長不能用作行約束。爲什麼? 我希望textarea能夠填充所有可用空間的最小和最大尺寸,但這不會發生。下面是代碼:JTextarea沒有使用miglayout垂直增長

import javax.swing.*; 
import net.miginfocom.swing.MigLayout; 
import java.awt.*; 
import java.awt.event.*; 
public class Notepad{ 
JFrame jf; 
JMenuBar jmbar; 
JMenu jm1,jm2; 
JMenuItem jmnew,jmopen,jmsave,jmexit; 
JMenuItem jmselect,jmpaste,jmcopy,jmcut; 
Notepad(){ 
    jf=new JFrame("Notepad"); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jf.setLayout(new MigLayout("debug,fill","","[push,grow]")); 

    /*Toolkit tk = Toolkit.getDefaultToolkit(); 
    int xSize = ((int) tk.getScreenSize().getWidth()); 
    int ySize = ((int) tk.getScreenSize().getHeight()); 
    jf.setSize(xSize,ySize); */ 
    jf.setExtendedState(Frame.MAXIMIZED_BOTH); 

    createTextArea(); 
    createMenu(); 
    //JTextArea txt=new JTextArea("", 0,0,); 
    jf.setMinimumSize(new Dimension(600,400)); 
    jf.setVisible(true); 
} 
void createMenu(){ 
    jmbar=new JMenuBar(); 
    jm1=new JMenu("File"); 
    jmnew=new JMenuItem("New"); 
    jmopen=new JMenuItem("Open"); 
    jmsave=new JMenuItem("Save"); 
    jmexit=new JMenuItem("Exit"); 
    jmexit.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent ae){ 
      System.exit(0); 
     } 
    }); 
    jm1.add(jmnew); 
    jm1.add(jmopen); 
    jm1.add(jmsave); 
    jm1.addSeparator(); 
    jm1.add(jmexit); 
    jmbar.add(jm1); 


    jm2=new JMenu("Edit"); 
    jmcut=new JMenuItem("Cut"); 
    jmcopy=new JMenuItem("Copy"); 
    jmpaste=new JMenuItem("Paste"); 
    jmselect=new JMenuItem("Select All"); 

    jm2.add(jmcut); 
    jm2.add(jmcopy); 
    jm2.add(jmpaste); 
    jm2.add(jmselect); 
    jmbar.add(jm2); 
    jf.setJMenuBar(jmbar); 

} 
void createTextArea(){ 
    JTextArea textArea = new JTextArea("", 10,40); 
    JScrollPane textScroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
      JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

    textArea.setFont(new Font("Century Gothic", Font.BOLD, 12)); 
    jf.add(textScroll,"grow,span,wrap"); 
} 
public static void main(String s[]){ 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
      new Notepad(); 
     } 
    }); 
} 
} 

回答

1

它看起來應該是,我沒有看到任何競爭組件。

無論如何,jf.add(textScroll,"w 100%, h 100%,span,wrap");都可以工作,儘管您可能需要修剪幾個像素以避免裁剪框架裝飾(即jf.add(textScroll,"w 100%-10, h 100%-10,span,wrap"),儘管我不認爲需要修剪。

+0

thanks.yes,微調不是必需的。 – crazy4

2

對我來說看起來像一個錯誤:將包裹從組件約束移動到佈局約束似乎使其行爲如預期。

jf = new JFrame("Notepad"); 
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
jf.setLayout(new MigLayout("debug, fill, wrap 1", "", "")); 
// add a label to better see the cell vs. component size 
// fills as expected without component wrap 
jf.add(new JLabel("nothing"), "grow"); 
// bug: doesn't fill vertically with component wrap 
//jf.add(new JLabel("nothing"), "grow, wrap"); 
jf.setSize(800, 600); 
jf.setVisible(true); 

這可能(或不是,沒有挖)涉及到的issue reported last summer