简体   繁体   English

Java GUI-JTextArea扩展但不收缩

[英]Java GUI - JTextArea expanding but not contracting

MAIN PROBLEM: In a JScrollPane with JPanel which contains a JTextArea, text wraps up if GUI is expanded but text does not wrap back when GUI is contracted. 主要问题:在带有JPanel且包含JTextArea的JScrollPane中,如果GUI展开,则文本将自动换行,而GUI收缩时,文本将不会回退。 See example below 见下面的例子

Okay I am building the GUI for an app I am currently working on and I am having a bit of a problem. 好的,我正在为当前正在使用的应用程序构建GUI,但遇到了一些问题。

The explanation: My GUI is structured as illustrated below: 说明:我的GUI的结构如下图所示:
在此处输入图片说明


And this is what it looks like. 这就是它的样子。

在此处输入图片说明

Upon expansion the the JTextArea inside the panelWithText expands and resizes the text as such: 扩展后,panelWithText内的JTextArea会扩展并调整文本大小,如下所示:
在此处输入图片说明

But the problem is what happens when you make the GUI smaller. 但是问题是当您缩小GUI时会发生什么。 The "problem" is that I want the text to warp back as it was before. “问题”是我希望文本像以前一样弯曲。 I did a little experimenting by implementing a ComponentListener to both the JScrollPane and the panelWithText and found out that componentResized is being called for panelWithText upon expansion but not for contraction. 我做了一个小实验通过实施ComponentListener到两个JScrollPanepanelWithText并发现componentResized正在呼吁panelWithText在膨胀而不是收缩。 Is there any way to implement the behavior of the text warping back in the panelWithText Component? 有什么方法可以在panelWithText组件中实现文本变形的行为吗?
在此处输入图片说明

PS: Apparently if I switch the JScrollPane with a regular JPanel it works. PS:显然,如果我使用常规的JPanel切换JScrollPane ,则它可以工作。 But I can't do that! 但是我做不到! I have a LOT of panelWithText to show to the user. 我有很多panelWithText可以显示给用户。

PS PS: Sorry here is the code I am using. PS PS:对不起,这是我正在使用的代码。
JFrameExt.java JFrameExt.java

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JScrollPane;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.FlowLayout;
import java.awt.Window.Type;
import javax.swing.ScrollPaneConstants;
import java.awt.CardLayout;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;


public class JFrameExt extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JFrameExt frame = new JFrameExt();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public JFrameExt() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 246, 164);
        contentPane = new JPanel();
        contentPane.setBorder(null);
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportBorder(null);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        contentPane.add(scrollPane, BorderLayout.CENTER);

        JPanel panel = new JPanel();
        scrollPane.setViewportView(panel);
        GridBagLayout gbl_panel = new GridBagLayout();
        gbl_panel.columnWidths = new int[]{0, 0};
        gbl_panel.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
        gbl_panel.columnWeights = new double[]{1.0, Double.MIN_VALUE};
        gbl_panel.rowWeights = new double[]{0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
        panel.setLayout(gbl_panel);

        panelWithText panelWithText_ = new panelWithText();
        GridBagConstraints gbc_panelWithText_ = new GridBagConstraints();
        gbc_panelWithText_.anchor = GridBagConstraints.NORTH;
        gbc_panelWithText_.insets = new Insets(0, 0, 5, 0);
        gbc_panelWithText_.fill = GridBagConstraints.HORIZONTAL;
        gbc_panelWithText_.gridx = 0;
        gbc_panelWithText_.gridy = 0;
        panel.add(panelWithText_, gbc_panelWithText_);

        panelWithText panelWithText__1 = new panelWithText();
        GridBagConstraints gbc_panelWithText__1 = new GridBagConstraints();
        gbc_panelWithText__1.insets = new Insets(0, 0, 5, 0);
        gbc_panelWithText__1.anchor = GridBagConstraints.NORTH;
        gbc_panelWithText__1.fill = GridBagConstraints.HORIZONTAL;
        gbc_panelWithText__1.gridx = 0;
        gbc_panelWithText__1.gridy = 1;
        panel.add(panelWithText__1, gbc_panelWithText__1);

        panelWithText panelWithText__2 = new panelWithText();
        GridBagConstraints gbc_panelWithText__2 = new GridBagConstraints();
        gbc_panelWithText__2.insets = new Insets(0, 0, 5, 0);
        gbc_panelWithText__2.fill = GridBagConstraints.BOTH;
        gbc_panelWithText__2.gridx = 0;
        gbc_panelWithText__2.gridy = 2;
        panel.add(panelWithText__2, gbc_panelWithText__2);

        panelWithText panelWithText__3 = new panelWithText();
        GridBagConstraints gbc_panelWithText__3 = new GridBagConstraints();
        gbc_panelWithText__3.insets = new Insets(0, 0, 5, 0);
        gbc_panelWithText__3.fill = GridBagConstraints.BOTH;
        gbc_panelWithText__3.gridx = 0;
        gbc_panelWithText__3.gridy = 3;
        panel.add(panelWithText__3, gbc_panelWithText__3);

        panelWithText panelWithText__4 = new panelWithText();
        GridBagConstraints gbc_panelWithText__4 = new GridBagConstraints();
        gbc_panelWithText__4.insets = new Insets(0, 0, 5, 0);
        gbc_panelWithText__4.fill = GridBagConstraints.BOTH;
        gbc_panelWithText__4.gridx = 0;
        gbc_panelWithText__4.gridy = 4;
        panel.add(panelWithText__4, gbc_panelWithText__4);

        panelWithText panelWithText__5 = new panelWithText();
        GridBagConstraints gbc_panelWithText__5 = new GridBagConstraints();
        gbc_panelWithText__5.insets = new Insets(0, 0, 5, 0);
        gbc_panelWithText__5.fill = GridBagConstraints.BOTH;
        gbc_panelWithText__5.gridx = 0;
        gbc_panelWithText__5.gridy = 5;
        panel.add(panelWithText__5, gbc_panelWithText__5);

        panelWithText panelWithText__6 = new panelWithText();
        GridBagConstraints gbc_panelWithText__6 = new GridBagConstraints();
        gbc_panelWithText__6.fill = GridBagConstraints.BOTH;
        gbc_panelWithText__6.gridx = 0;
        gbc_panelWithText__6.gridy = 6;
        panel.add(panelWithText__6, gbc_panelWithText__6);
        setSize(300,100);
    }

}

panelWithText.java panelWithText.java

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JTextArea;
import javax.swing.ImageIcon;
import java.awt.BorderLayout;


public class panelWithText extends JPanel {

    /**
     * Create the panel.
     */
    public void me_resized(Dimension d){
        System.out.println("CALLED..");
        super.setPreferredSize(d);
    }
    public panelWithText() {
        setBackground(Color.DARK_GRAY);
        setForeground(Color.WHITE);
        setLayout(new BorderLayout(0, 0));

        JTextArea txtrIveBeenReading = new JTextArea();
        txtrIveBeenReading.setEditable(false);
        txtrIveBeenReading.setColumns(28);
        txtrIveBeenReading.setFont(new Font("Tahoma", Font.PLAIN, 10));
        txtrIveBeenReading.setLineWrap(true);
        txtrIveBeenReading.setWrapStyleWord(true);
        txtrIveBeenReading.setText("\n A bunch of really important text here... A bunch of really important text here... A bunch of really important text here... A bunch of really important text here...\n");
        txtrIveBeenReading.setForeground(Color.WHITE);
        txtrIveBeenReading.setBackground(Color.DARK_GRAY);
        add(txtrIveBeenReading, BorderLayout.CENTER);

    }

}

After a little playing around, I came up with this... 经过一番游戏后,我想到了这个...

在此处输入图片说明在此处输入图片说明在此处输入图片说明

public class Test {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JFrameExt frame = new JFrameExt();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public static class ScrollablePane extends JPanel implements Scrollable {

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return new Dimension(100, 100);
        }

        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 64;
        }

        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 128;
        }

        @Override
        public boolean getScrollableTracksViewportWidth() {
            return true;
        }

        @Override
        public boolean getScrollableTracksViewportHeight() {
            return false;
        }

    }

    public static class JFrameExt extends JFrame {

        private JPanel contentPane;

        /**
         * Create the frame.
         */
        public JFrameExt() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 246, 164);
            contentPane = new JPanel();
            contentPane.setBorder(null);
            contentPane.setLayout(new BorderLayout(0, 0));
            setContentPane(contentPane);

            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setViewportBorder(null);
            scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            contentPane.add(scrollPane, BorderLayout.CENTER);

            JPanel panel = new ScrollablePane();
            scrollPane.setViewportView(panel);
            GridBagLayout gbl_panel = new GridBagLayout();
//            gbl_panel.columnWidths = new int[]{0, 0};
//            gbl_panel.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
//            gbl_panel.columnWeights = new double[]{1.0, Double.MIN_VALUE};
//            gbl_panel.rowWeights = new double[]{0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
            panel.setLayout(gbl_panel);

            panelWithText panelWithText_ = new panelWithText();
            GridBagConstraints gbc_panelWithText_ = new GridBagConstraints();
            gbc_panelWithText_.anchor = GridBagConstraints.NORTH;
            gbc_panelWithText_.insets = new Insets(0, 0, 5, 0);
            gbc_panelWithText_.fill = GridBagConstraints.HORIZONTAL;
            gbc_panelWithText_.gridx = 0;
            gbc_panelWithText_.gridy = 0;
            gbc_panelWithText_.weightx = 1;
            panel.add(panelWithText_, gbc_panelWithText_);

//            panelWithText panelWithText__1 = new panelWithText();
//            GridBagConstraints gbc_panelWithText__1 = new GridBagConstraints();
//            gbc_panelWithText__1.insets = new Insets(0, 0, 5, 0);
//            gbc_panelWithText__1.anchor = GridBagConstraints.NORTH;
////            gbc_panelWithText__1.fill = GridBagConstraints.HORIZONTAL;
//            gbc_panelWithText__1.gridx = 0;
//            gbc_panelWithText__1.gridy = 1;
//            panel.add(panelWithText__1, gbc_panelWithText__1);
//
//            panelWithText panelWithText__2 = new panelWithText();
//            GridBagConstraints gbc_panelWithText__2 = new GridBagConstraints();
//            gbc_panelWithText__2.insets = new Insets(0, 0, 5, 0);
////            gbc_panelWithText__2.fill = GridBagConstraints.BOTH;
//            gbc_panelWithText__2.gridx = 0;
//            gbc_panelWithText__2.gridy = 2;
//            panel.add(panelWithText__2, gbc_panelWithText__2);
//
//            panelWithText panelWithText__3 = new panelWithText();
//            GridBagConstraints gbc_panelWithText__3 = new GridBagConstraints();
//            gbc_panelWithText__3.insets = new Insets(0, 0, 5, 0);
////            gbc_panelWithText__3.fill = GridBagConstraints.BOTH;
//            gbc_panelWithText__3.gridx = 0;
//            gbc_panelWithText__3.gridy = 3;
//            panel.add(panelWithText__3, gbc_panelWithText__3);
//
//            panelWithText panelWithText__4 = new panelWithText();
//            GridBagConstraints gbc_panelWithText__4 = new GridBagConstraints();
//            gbc_panelWithText__4.insets = new Insets(0, 0, 5, 0);
////            gbc_panelWithText__4.fill = GridBagConstraints.BOTH;
//            gbc_panelWithText__4.gridx = 0;
//            gbc_panelWithText__4.gridy = 4;
//            panel.add(panelWithText__4, gbc_panelWithText__4);
//
//            panelWithText panelWithText__5 = new panelWithText();
//            GridBagConstraints gbc_panelWithText__5 = new GridBagConstraints();
//            gbc_panelWithText__5.insets = new Insets(0, 0, 5, 0);
////            gbc_panelWithText__5.fill = GridBagConstraints.BOTH;
//            gbc_panelWithText__5.gridx = 0;
//            gbc_panelWithText__5.gridy = 5;
//            panel.add(panelWithText__5, gbc_panelWithText__5);
//
//            panelWithText panelWithText__6 = new panelWithText();
//            GridBagConstraints gbc_panelWithText__6 = new GridBagConstraints();
////            gbc_panelWithText__6.fill = GridBagConstraints.BOTH;
//            gbc_panelWithText__6.gridx = 0;
//            gbc_panelWithText__6.gridy = 6;
//            panel.add(panelWithText__6, gbc_panelWithText__6);
            setSize(300, 100);
        }
    }

    public static class panelWithText extends JPanel {

        /**
         * Create the panel.
         */
        public void me_resized(Dimension d) {
            System.out.println("CALLED..");
            super.setPreferredSize(d);
        }

        public panelWithText() {
            setBackground(Color.DARK_GRAY);
            setForeground(Color.WHITE);
            setLayout(new BorderLayout(0, 0));

            JTextArea txtrIveBeenReading = new JTextArea();
            txtrIveBeenReading.setEditable(false);
            txtrIveBeenReading.setColumns(28);
            txtrIveBeenReading.setFont(new Font("Tahoma", Font.PLAIN, 10));
            txtrIveBeenReading.setLineWrap(true);
            txtrIveBeenReading.setWrapStyleWord(true);
            txtrIveBeenReading.setText("\n A bunch of really important text here... A bunch of really important text here... A bunch of really important text here... A bunch of really important text here...\n");
            txtrIveBeenReading.setForeground(Color.WHITE);
            txtrIveBeenReading.setBackground(Color.DARK_GRAY);
            add(txtrIveBeenReading, BorderLayout.CENTER);

        }
    }
}

Basically, you need a container that implements the Scrollable interface. 基本上,您需要一个实现Scrollable接口的容器。 This will allow you to specify that the container should track/match the view ports width. 这将允许您指定容器应跟踪/匹配视口宽度。 This will cause the container to be laid out when ever the view port changes size... 每当查看端口更改大小时,这将导致容器被放置...

As a side note, you can use a single copy of the GridBagConstraints , when you add each new component to the container, the GridBagLayout will generate a copy of it's own. 附带说明一下,您可以使用GridBagConstraints的单个副本,将每个新组件添加到容器时, GridBagLayout都会生成其自己的副本。 This is very powerful when you want to share properties of the GridBagConstraints between components ;) 当您要在组件之间共享GridBagConstraints属性时,此功能非常强大;)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM