Java GUI - JTextArea扩展但不收缩

时间:2013-01-04 01:02:56

标签: java swing jpanel jscrollpane

主要问题:在包含JTextArea的JPanel的JScrollPane中,如果GUI已展开,则文本将换行,但在收缩GUI时文本不会回退。见下面的例子

好的我正在构建我正在处理的应用程序的GUI,我遇到了一些问题。

解释:我的GUI结构如下图所示:
enter image description here

这就是它的样子。

enter image description here

在扩展时,panelWithText内的JTextArea会扩展并调整文本大小:
enter image description here

但问题是当你缩小GUI时会发生什么。 “问题”是我希望文本像以前一样回转。我通过对ComponentListenerJScrollPane实施panelWithText进行了一些实验,发现componentResized在扩展时被调用panelWithText但没有收缩。有没有办法在panelWithText组件中实现文本变形的行为?
enter image description here

PS:显然,如果我使用常规JScrollPane切换JPanel,则可行。但我做不到!我有很多panelWithText向用户显示。

PS PS:对不起,这是我正在使用的代码。
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

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);

    }

}

1 个答案:

答案 0 :(得分:4)

经过一番玩耍后,我想出了这个......

enter image description here enter image description here enter image description here

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);

        }
    }
}

基本上,您需要一个实现Scrollable接口的容器。这将允许您指定容器应跟踪/匹配视图端口宽度。这将导致容器在视口改变大小时布局......

作为旁注,您可以使用GridBagConstraints的单个副本,当您将每个新组件添加到容器时,GridBagLayout将生成它自己的副本。当您想要在组件之间共享GridBagConstraints的属性时,这非常强大;)