JTextarea 没有使用 miglayout 垂直增长

Posted

技术标签:

【中文标题】JTextarea 没有使用 miglayout 垂直增长【英文标题】:JTextarea not growing vertically using miglayout 【发布时间】:2012-12-20 07:19:32 【问题描述】:

这是使用 miglayout 在 swing 中使用简单记事本的代码。我使用 span 和 grow 来填充水平空间,但 fill 和 grow 不能用作行约束。为什么? 我希望 textarea 以最小和最大尺寸填充所有可用空间,但这并没有发生。下面是代码:

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】:

对我来说看起来像一个错误:将 wrap 从组件约束移动到布局约束似乎使它的行为符合预期。

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 相关

【讨论】:

【参考方案2】:

看起来应该是这样,我没有看到任何竞争组件。

不管怎样,jf.add(textScroll,"w 100%, h 100%,span,wrap"); 会起作用,尽管您可能需要修剪一些像素以防止它剪裁框架装饰(即jf.add(textScroll,"w 100%-10, h 100%-10,span,wrap"),但我认为不需要修剪。

【讨论】:

以上是关于JTextarea 没有使用 miglayout 垂直增长的主要内容,如果未能解决你的问题,请参考以下文章

具有本机外观的 Miglayout 具有不同的行为

JTextArea 行限制

为啥 JScrollpane 没有添加到我的 TextEditor 中的 JTextArea?

使用 JTextArea 的计算器

如何在JTextArea中设置文本格式

JTextArea:如何用文字而不是字符来换行?