【问题标题】:JTextArea Won't Update Unless I Resize JFrame除非我调整 JFrame 的大小,否则 JTextArea 不会更新
【发布时间】:2014-01-16 18:19:02
【问题描述】:

每当我运行我的程序时,我的 JTextArea 不遵循我给它的尺寸,但是如果我调整我的 JFrame 的大小,它会更新并将它的大小设置为我放置的大小。

有什么问题?

    public ControlPanel() {
    // create our list of players
    list = new JList(model);

    // create our scroll panes
    userspane = new JScrollPane(list);
    consolepane = new JScrollPane(console);

    // set sizes
    userspane.setSize(100, 500);
    jta.setSize(100, 500);
    list.setSize(100, 500);
    consolepane.setSize(100, 500);
    console.setSize(100, 500);

    // add to panel
    panel.add(userspane, BorderLayout.CENTER);
    panel.add(kick);
    panel.add(ban);
    panel.add(info);
    panel.add(consolepane, BorderLayout.CENTER);

    // set frame properties
    setTitle("RuneShadows CP");
    setSize(280, 400);
    //setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setContentPane(panel);
    setVisible(true);
}

【问题讨论】:

  • “有什么问题?” - 您正在为所有内容设置大小。只需.pack(),让它为您完成所有尺寸调整。
  • 我使用了 pack() 但第二个 JTextBox 的大小仍然不合适..

标签: java swing jframe layout-manager jtextarea


【解决方案1】:

不要将尺寸设置为任何东西

  • 对于JTextArea,您可以使用构造函数JTextArea(int rows, int charSpaces)
  • 只需pack()JFrame,它将尊重内部组件的所有首选尺寸。
  • 另外,不要将内容窗格设置为面板,只需添加面板即可。这将在调用 pack() 时尊重面板的首选大小

我不确定是什么变量(或您想要的大小),所以我假设文本区域和其他区域也是如此。请参阅这个示例,我刚刚使用了我提到的 JTextArea 构造函数和 packed。

已编辑未设置尺寸

import java.awt.BorderLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class ControlPanel extends JFrame {

    JScrollPane userspane;
    JList list;
    DefaultListModel model = new DefaultListModel();
    JScrollPane consolepane;
    JTextArea console = new JTextArea(20, 50);
    JTextArea jta = new JTextArea(6, 50);
    JPanel panel = new JPanel();

    JButton kick = new JButton("Kick");
    JButton ban = new JButton("Ban");
    JButton info = new JButton("Info");

    public ControlPanel() {
        // create our list of players
        list = new JList(model);

        // create our scroll panes
        userspane = new JScrollPane(list);
        consolepane = new JScrollPane(console);

        // add to panel
        panel.add(userspane, BorderLayout.CENTER);
        panel.add(kick);
        panel.add(ban);
        panel.add(info);
        panel.add(consolepane, BorderLayout.CENTER);

        add(panel);
        pack();
        setTitle("RuneShadows CP");
        //setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                new ControlPanel();
            }
        });
    }
}

更新 - 带定位

还要记住,对于BorderLayout,您需要为添加的每个组件指定一个位置,否则它将默认为CENTER,并且每个位置只有一个组件。我注意到您尝试将两个组件添加到 CENTER

import java.awt.BorderLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class ControlPanel extends JFrame {

    JScrollPane userspane;
    JList list;
    DefaultListModel model = new DefaultListModel();
    JScrollPane consolepane;
    JTextArea console = new JTextArea(20, 50);
    JTextArea jta = new JTextArea(6, 50);
    JPanel panel = new JPanel(new BorderLayout());

    JButton kick = new JButton("Kick");
    JButton ban = new JButton("Ban");
    JButton info = new JButton("Info");

    public ControlPanel() {
        // create our list of players
        list = new JList(model);

        // create our scroll panes
        userspane = new JScrollPane(list);
        consolepane = new JScrollPane(console);

        // add to panel
        panel.add(userspane, BorderLayout.SOUTH);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(kick);
        buttonPanel.add(ban);
        buttonPanel.add(info);
        panel.add(buttonPanel, BorderLayout.CENTER);
        panel.add(consolepane, BorderLayout.NORTH);

        add(panel);
        pack();
        setTitle("RuneShadows CP");
        //setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                new ControlPanel();
            }
        });
    }
}

【讨论】:

  • 谢谢! :) 得到了我想要的。
  • 请记住,使用BorderLayout,您需要为添加的每个组件指定一个位置,否则它将默认为CENTER,并且每个位置只有一个组件。我注意到您试图将两个组件添加到 CENTER
  • 正确使用BorderLayout定位查看我的UPDATE
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2016-04-20
  • 2012-06-19
  • 1970-01-01
  • 2014-12-03
相关资源
最近更新 更多