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

好的,我正在为当前正在使用的应用程序构建GUI,但遇到了一些问题。
说明:我的GUI的结构如下图所示:


这就是它的样子。


扩展后,panelWithText内的JTextArea会扩展并调整文本大小,如下所示:


但是问题是当您缩小GUI时会发生什么。 “问题”是我希望文本像以前一样弯曲。我通过对ComponentListenerJScrollPane都实现了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);

    }

}

最佳答案

经过一番游戏后,我想到了这个...



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的属性时,此功能非常强大;)

07-25 22:46