java - JScrollPane 仅使用水平滚动条显示内容

标签 java swing

我想在窗口中显示字符串列表,并且尝试使用 JScrollPane 包围的 JPanel,因为字符串列表的大小未知。问题是窗口水平显示文本,我想逐行显示。如何解决这个问题?这是我到目前为止编写的代码。

package interface_classes;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

public class ErrorMessageW {

    private JFrame errorMessageW;
    private ArrayList<String> errors;
    private JPanel panel;
    private JScrollPane scrollPane;
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        final ArrayList<String> err = new ArrayList<>();
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ErrorMessageW window = new ErrorMessageW(err);
                    window.errorMessageW.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public ErrorMessageW(ArrayList<String> err) {
        errors = err;
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        errorMessageW = new JFrame();
        errorMessageW.setTitle("Unfilled forms");
        errorMessageW.setBounds(100, 100, 367, 300);
        errorMessageW.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JButton btnOk = new JButton("OK");
        btnOk.setBounds(239, 208, 89, 23);
        btnOk.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                errorMessageW.dispose();
            }
        });
        errorMessageW.getContentPane().setLayout(null);
        errorMessageW.getContentPane().add(btnOk);
        
        scrollPane = new JScrollPane();
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setBounds(10, 10, 330, 175);
        errorMessageW.getContentPane().add(scrollPane);
        
        panel = new JPanel();
        for(String s : errors){
            JTextArea text = new JTextArea(1,20);
            text.setText(s);
            text.setFont(new Font("Verdana",1,10));
            text.setForeground(Color.RED);
            panel.add(text);
            
        }   
        scrollPane.setViewportView(panel);
    }
    
    public JFrame getErrorMessageW() {
        return errorMessageW;
    }

    public void setErrorMessageW(JFrame errorMessageW) {
        this.errorMessageW = errorMessageW;
    }


}

这就是我得到的 enter image description here

这就是我想要的,但是使用 JScrollPane: enter image description here

最佳答案

enter image description here

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.ArrayList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ErrorMessageW {

    private JFrame errorMessageW;
    private ArrayList<String> errors;
    private JPanel panel;
    private JScrollPane scrollPane;
    private JTextArea errorMessage = new JTextArea(3, 30);

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        final ArrayList<String> err = new ArrayList<String>();
        err.add("Short String");
        err.add("A very very very very very very very very very very very "
                + "very very very very very very very very very very very "
                + "very very very very very very very very long String");
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                try {
                    ErrorMessageW window = new ErrorMessageW(err);
                    window.errorMessageW.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public ErrorMessageW(ArrayList<String> err) {
        errors = err;
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        errorMessageW = new JFrame();
        JPanel contentPane = new JPanel(new BorderLayout(5, 15));
        contentPane.setBorder(new EmptyBorder(10, 10, 10, 10));
        errorMessage.setLineWrap(true);
        errorMessage.setWrapStyleWord(true);
        JScrollPane jsp = new JScrollPane(
                errorMessage,
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
                );
        contentPane.add(jsp, BorderLayout.PAGE_START);

        errorMessageW.add(contentPane);
        errorMessageW.setTitle("Unfilled forms");
        errorMessageW.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JButton btnOk = new JButton("OK");
        btnOk.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent arg0) {
                errorMessageW.dispose();
            }
        });
        JPanel btnConstrain = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        btnConstrain.add(btnOk);
        contentPane.add(btnConstrain, BorderLayout.PAGE_END);

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

        DefaultListModel<String> listModel = new DefaultListModel<String>();
        for (String s : errors) {
            listModel.addElement(s);
        }
        final JList<String> errorList = new JList<String>(listModel);
        Dimension preferredSize = new Dimension(errorMessage.getPreferredSize().width,200);
        errorList.setPreferredSize(preferredSize);
        ListSelectionListener errorSelect = new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                errorMessage.setText(errorList.getSelectedValue());
            }
        };
        errorList.addListSelectionListener(errorSelect);
        scrollPane.setViewportView(errorList);
        errorMessageW.pack();
    }

    public JFrame getErrorMessageW() {
        return errorMessageW;
    }

    public void setErrorMessageW(JFrame errorMessageW) {
        this.errorMessageW = errorMessageW;
    }
}

关于java - JScrollPane 仅使用水平滚动条显示内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20997054/

相关文章:

java - 泛型的泛型如何工作?

java - JPanel 和处理它们之间的事件

java - 来自 slider 的 JButton 背景颜色

java - Android 运行访问

java - Android应用程序中的JSON解析

Java - 是否可以将 JMenuBar 添加到 JFrame 的装饰窗口?

JAVA:如何使用paint()方法更新之前绘制的对象?

java - 使用 MigLayout 用两个组件填充整个单元格

java - 为什么 Eclipse 插件代码无法从外部 java swing 应用程序调用 swingworking 线程?

java - 如何使用 UUID 维护插入顺序