2

主要问题:在包含 JTextArea 的带有 JPanel 的 JScrollPane 中,如果 GUI 展开,则文本会自动换行,但当 GUI 收缩时,文本不会返回。请参阅下面的示例

好的,我正在为我目前正在开发的应用程序构建 GUI,但我遇到了一些问题。

解释: 我的 GUI 结构如下图所示:
在此处输入图像描述


这就是它的样子。

在此处输入图像描述

展开后,panelWithText 内的 JTextArea 会展开并调整文本的大小,如下所示:
在此处输入图像描述

但问题是当你缩小 GUI 时会发生什么。“问题”是我希望文本像以前一样弯曲回来。我通过ComponentListener对 theJScrollPane和 the实现 a 做了一些实验panelWithText,发现它在扩展时componentResized需要panelWithText,但在收缩时不需要。有没有办法在panelWithText组件中实现文本回退的行为?
在此处输入图像描述

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

    }

}
4

1 回答 1

4

玩了一会儿,我想出了这个......

在此处输入图像描述在此处输入图像描述在此处输入图像描述

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

于 2013-01-04T03:18:59.937 回答