如何强制JContainer重新布局?

时间:2013-04-18 18:54:19

标签: java swing layout jtextarea jdialog

JFrame BorderLayout JTextArea NORTHJButton SOUTH pack() pack()我在开始时repaint()

我的代码更改了文本区域的字体大小。如何强制对话框窗口及其组件重新布局?

到目前为止,我尝试了一些组合:

  • 另一个revalidate()
  • import java.awt.*; import javax.swing.*; import java.awt.event.*; public class MyFrame extends JFrame implements ActionListener{ private JTextArea txt; private JButton bis; private JFrame frame; int size = 10; private void BuildMainGUI() { txt = new JTextArea("This is just a line of text"); bis = new JButton("Increase size"); JPanel p1 = new JPanel(); bis.addActionListener(this); BorderLayout bl = new BorderLayout(); p1.setLayout(bl); p1.add(txt, BorderLayout.NORTH); p1.add(bis, BorderLayout.SOUTH); frame = new JFrame(); frame.setContentPane(p1); frame.setVisible(true); frame.pack(); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); } @Override public void actionPerformed(ActionEvent e) { size += 2; Font newFont = new Font("Courier", Font.PLAIN, size); txt.setFont(newFont); frame.revalidate(); frame.pack(); } /** * @param args */ public static void main(String[] args) { MyFrame myGUI = new MyFrame(); myGUI.BuildMainGUI(); } }
  • {{1}}

它似乎没有帮助。

是否有保证蛮力的方法?实现这种结果的正确方法是什么?

更新

在创建SCCE(见下文)时,我在原始代码中发现了两个错误并修复了它们。 框架现在很好地重新调整大小。

我仍然怀疑这是否是正确的方式。

{{1}}

1 个答案:

答案 0 :(得分:3)

在ActionListener中描述了所有三个交替,让它们最简单的工作,好像是坐标是一样的(我认为最需要深入研究TextLayout ???)

enter image description here enter image description here

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class ResizeJTextArea {

    private JFrame frame = new JFrame();
    private JScrollPane scrollPane = new JScrollPane();
    private JTextArea textArea = new JTextArea(10, 15);
    private JButton button = new JButton("change");
    private Font newFont = new Font("Courier", Font.PLAIN, 10);

    public ResizeJTextArea() {
        textArea.setText("This is just a line of text");
        textArea.setFont(newFont);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.setFont(textArea.getFont().deriveFont(20f));

                //2. choice
                //textArea.setColumns(20);
                //textArea.setRows(20);

                //3rd. coice
                //override PreferredScrollableViewportSize
                frame.pack();
            }
        });
        scrollPane.setViewportView(textArea);
        frame.add(scrollPane);
        frame.add(button, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(100, 100);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                ResizeJTextArea fs = new ResizeJTextArea();
            }
        });
    }
}