Java 使用JList和ListCellRenderer在ListCell上具有多行文本

Java 使用JList和ListCellRenderer在ListCell上具有多行文本,java,swing,jpanel,jlist,listcellrenderer,Java,Swing,Jpanel,Jlist,Listcellrenderer,此类实例由我的ListCellRenderer返回: public class SessionQALine extends JPanel { private JTextArea question; private JLabel answer; public SessionQALine() { setLayout(new BoxLayout(this,BoxLayout.X_AXIS)); setOpaque(false);

此类实例由我的ListCellRenderer返回:

    public class SessionQALine extends JPanel {
    private JTextArea question;
    private JLabel answer;
    public SessionQALine() {
        setLayout(new BoxLayout(this,BoxLayout.X_AXIS));
        setOpaque(false);
        question = new JTextArea();
        question.setLineWrap(true);
        question.setWrapStyleWord(true);
        question.setFont(new Font(Font.SERIF, Font.ITALIC|Font.BOLD, 14));
        question.setOpaque(false);
        answer = new JLabel();
        answer.setFont(new Font(Font.SERIF, Font.BOLD, 10));
        answer.setOpaque(false);
            add(question);
        add(Box.createHorizontalGlue());
        add(answer);
    }

    public void setQuestion(String q) {
        question.setText(q);
    }
    public void setAnswer(String q) {
        answer.setText(q);
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawLine(0, getHeight()-1, getWidth(), getHeight()-1);
    }
}
private SessionQALine qaLine = new SessionQALine();
@Override
public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {
    qaLine.setQuestion(questions.get(index));
    qaLine.setAnswer(answers.get(index));
    return qaLine;
}
这是我的ListCellRenderer的一部分:

    public class SessionQALine extends JPanel {
    private JTextArea question;
    private JLabel answer;
    public SessionQALine() {
        setLayout(new BoxLayout(this,BoxLayout.X_AXIS));
        setOpaque(false);
        question = new JTextArea();
        question.setLineWrap(true);
        question.setWrapStyleWord(true);
        question.setFont(new Font(Font.SERIF, Font.ITALIC|Font.BOLD, 14));
        question.setOpaque(false);
        answer = new JLabel();
        answer.setFont(new Font(Font.SERIF, Font.BOLD, 10));
        answer.setOpaque(false);
            add(question);
        add(Box.createHorizontalGlue());
        add(answer);
    }

    public void setQuestion(String q) {
        question.setText(q);
    }
    public void setAnswer(String q) {
        answer.setText(q);
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawLine(0, getHeight()-1, getWidth(), getHeight()-1);
    }
}
private SessionQALine qaLine = new SessionQALine();
@Override
public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {
    qaLine.setQuestion(questions.get(index));
    qaLine.setAnswer(answers.get(index));
    return qaLine;
}
当字符串放在一行中时,一切正常,但如果需要多行,则第二行和其他行似乎不在考虑范围内,JList会绘制单元格,而这些行永远不会显示出来,您知道我如何修复它吗?

  • 对于
    JList
    JTable
    最容易使用
    doLayout()
    ,而不是
    getPreferredSize

  • 最舒服的方法是将
    JTextArea
    放入
    JScrollPane
    ,以便更好地输出到GUI

  • 请注意,然后必须从父级
    JScrollPane
    重定向到鼠标光标下的
    JScrollPane
    (五行六行代码,并且在这里解决了几次)

  • 使用
    Borders
    jsepator
    代替
    drawLine()

你是什么意思

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.text.*;
//http://tips4java.wordpress.com/2008/10/26/text-utilities/
public class AutoWrapTest {

    public JComponent makeUI() {
        String[] columnNames = {" Text Area Cell Renderer "};
        Object[][] data = {
            {"123456789012345678901234567890"},
            {"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddx"},
            {"----------------------------------------------0"},
            {">>>>>>>>>>>>>dddddddddddddddddddddddddddddddddddddddddddddddddd"
                + "dddddddxdddddddddddddddddddddddddddddddddddddddddddddd"
                + "dddddddddddx>>>>>>>>>>>>>>>>>>>>>>>>>|"},
            {">>>>>>>>>>>>ddddddddddddddddddddddddddddddddddddddddddddddddddd"
                + "ddddddx>>>>>>>>>>>>>>>>>>>>>>>>>>|"},
            {"a|"},
            {">>>>>>>>bbbb>>>>>>>>>>>>>>>>>>>|"},
            {">>>>>>>>>>>>>>>>>>|"},
            {">>>>>>>>>>>>>dddddddddddddddddddddddddddddddddddddddddddddddddd"
                + "dddddddxdddddddddddddd123456789012345678901234567890dddddd"
                + "dddddddddddddddddddddddddddddddddddddx>>>>>>>>>>>>>>>>>>>>"
                + ">>>>>|"},
            {">>>>>>>>>>>>>dddddddddddddd123456789012345678901234567890dddddd"
                + "dddddddddddddddddddddddddddddddddddddxdddddddddddddd123456"
                + "789012345678901234567890dddddddddddddddddddddddddddddddddd"
                + "ddddd123456789012345678901234567890ddddx>>>>>>>>>>>>>>>>>>"
                + ">>>>>>>|"},};
        TableModel model = new DefaultTableModel(data, columnNames) {

            private static final long serialVersionUID = 1L;

            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        JTable table = new JTable(model) {

            private static final long serialVersionUID = 1L;

            @Override
            public void doLayout() {
                TableColumn col = getColumnModel().getColumn(0);
                for (int row = 0; row < getRowCount(); row++) {
                    Component c = prepareRenderer(col.getCellRenderer(), row, 0);
                    if (c instanceof JTextArea) {
                        JTextArea a = (JTextArea) c;
                        int h = getPreferredHeight(a) + getIntercellSpacing().height;
                        if (getRowHeight(row) != h) {
                            setRowHeight(row, h);
                        }
                    }
                }
                super.doLayout();
            }

            private int getPreferredHeight(JTextComponent c) {
                Insets insets = c.getInsets();
                View view = c.getUI().getRootView(c).getView(0);
                int preferredHeight = (int) view.getPreferredSpan(View.Y_AXIS);
                return preferredHeight + insets.top + insets.bottom;
            }
        };
        table.setEnabled(false);
        table.setShowGrid(false);
        table.setTableHeader(null);
        table.getColumnModel().getColumn(0).setCellRenderer(new TextAreaCellRenderer());
        //table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane sp = new JScrollPane(table);
        sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        sp.setPreferredSize(new Dimension(250, 533));
        JPanel p = new JPanel(new BorderLayout());
        p.add(sp);
        return p;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().add(new AutoWrapTest().makeUI());
        f.setLocation(100, 100);
        f.pack();
        f.setVisible(true);
    }
}

class TextAreaCellRenderer extends JTextArea implements TableCellRenderer {

    private static final long serialVersionUID = 1L;
    private final Color evenColor = new Color(230, 240, 255);

    public TextAreaCellRenderer() {
        super();
        setLineWrap(true);
        setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(table.getBackground());
            setBackground((row % 2 == 0) ? evenColor : getBackground());
        }
        setFont(table.getFont());
        setText((value == null) ? "" : value.toString());
        return this;
    }
}
import java.awt.*;
导入javax.swing.*;
导入javax.swing.table.*;
导入javax.swing.text.*;
//http://tips4java.wordpress.com/2008/10/26/text-utilities/
公共类自动包装{
公共JComponent makeUI(){
String[]columnNames={“文本区域单元格呈现程序”};
对象[][]数据={
{"123456789012345678901234567890"},
{“ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddx”},
{"----------------------------------------------0"},
{“>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+“dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd”
+“dddddddddd x>>>>>>>>>>>>>>>>>>>>>>>>>>>>|”,
{“>>>>>>>>>>>>dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd”
+“DDDDDD X>>>>>>>>>>>>>>>>>>>>>>>>>>>>|“},
{“a |”},
{>>>>>>>>bbbb>>>>>>>>>>>>>>>>>>>>>|“},
{">>>>>>>>>>>>>>>>>>|"},
{“>>>>>>>>>>>>>>滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴滴
+“DDDD XDDDD12345678901234567801234567890DDDD”
+“dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+ ">>>>>|"},
{“>>>>>>>>>>>>>>DDDDDDDDDDDD 12345678900123456789012345678901234567890DDDD”
+“DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD123456”
+“7890123456789001234567890DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
+“DDD 12345678900123456789012345678901234567890DDX>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>”
+ ">>>>>>>|"},};
TableModel model=新的DefaultTableModel(数据、列名){
私有静态最终长serialVersionUID=1L;
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
};
JTable表格=新JTable(型号){
私有静态最终长serialVersionUID=1L;
@凌驾
公共空间布局(){
TableColumn col=getColumnModel().getColumn(0);
对于(int row=0;row