TextArea溢出分配给它的边界以及Borderlayout的中心并覆盖整个窗口

时间:2014-01-09 21:14:53

标签: java swing jscrollpane jtextarea border-layout

所以我早些时候问了类似的问题并得到了我问的问题的答案,但我显然没有问正确的问题。所以,我在这里要完成的是将文本区域仅填充在jFrame的中心。正如你所看到的,它被设置为borderlayout,底部有一些按钮,顶部有一个标签(然后 - 在这个程序的完整版本上 - 被替换为文本框架时被复制到文本框架中来自按钮上的动作侦听器的文本)

问题是,文本区域填满整个窗口并覆盖窗口上的每个其他组件。我已经尝试使用首选大小,我尝试指定列/行,我已经阅读了docs.oracle上的教程,虽然我想,因为我仍然遇到麻烦,我可能错过了一个。

此外,我在docs.oracle信息中找到偏移注释行,对于文本换行,这是一个好主意,因为它将成为已发生事件的日志。我尝试添加该网站上建议的所有导入,但netbeans仍然给我一个红色下划线,他们不被识别为命令。他们被弃用了,我没有正确使用它们,还是我错过了导入?

我知道我问了很多,但感谢你的时间和耐心!

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package theproblem;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.TextArea;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/**
 *
 * @author Heather
 */
public class TheProblem {

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) {

        JFrame window2 = new JFrame();
        TextArea battleLogging = new TextArea(3,10);
        JScrollPane logScrollPane = new JScrollPane(battleLogging);
        JLabel BattleLog = new JLabel();
        JLabel p1HPLabel= new JLabel();
        JLabel p2HPLabel= new JLabel();
        String attack1ButtonContents = "Just an attack";
        String attack2ButtonContents = "Just another attack";
        JButton attack1=new JButton(attack1ButtonContents);
        JButton attack2=new JButton(attack2ButtonContents);


        window2.setLayout(new BorderLayout());
        window2.setSize(400,400);
        JPanel attackPanel = new JPanel();
        attackPanel.add(attack1);
        attackPanel.add(attack2);

        window2.add(battleLogging, BorderLayout.CENTER);
        battleLogging.setEditable(false);
        logScrollPane.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        logScrollPane.setPreferredSize(new Dimension(50, 50));


        //battleLogging.setLineWrap(true);
        //battleLogging.setWrapStyleWord(true);


        window2.add(BattleLog, BorderLayout.NORTH);
        window2.add(p1HPLabel, BorderLayout.WEST);
        window2.add(p2HPLabel, BorderLayout.EAST);
        window2.setVisible(true);
        window2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


}

1 个答案:

答案 0 :(得分:3)

问题:

  • 添加任何组件BorderLayout.CENTER时,无论您提供的是什么尺寸或首选尺寸,它都会填充中心位置。
  • 你甚至不应该设置尺寸。
  • 不要将TextAreas与Swing应用程序一起使用。使用JTextAreas
  • 设置JTextArea的列数和行数,让它为您调整大小。
  • 在显示之前不要忘记打包GUI。

例如:

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.*;

public class TheProblem2 {
   private static void createAndShowGUI() {
      int rows = 5;
      int cols = 20;
      JTextArea textArea = new JTextArea(rows, cols);
      JScrollPane scrollPane = new JScrollPane(textArea);
      scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

      JButton button1 = new JButton("Button 1");
      JButton button2 = new JButton("Button 1");
      JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
      btnPanel.add(button1);
      btnPanel.add(button2);

      JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add(scrollPane);
      mainPanel.add(btnPanel, BorderLayout.SOUTH);

      JFrame frame = new JFrame("EG 2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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